• 中文
    • English
  • 注册
  • 查看作者
  • 11:Druid

    一.  原方法

    首先使用之前的方法,计算一下创建100次链接耗时:

    public class Test {
        public static void main(String[] args) throws SQLException {
            JDBCUtils js = new JDBCUtils();
            long start = System.currentTimeMillis();
            for (int i = 0; i < 100; i++) {
                Connection connection = js.getConnection();
                System.out.println(connection);
                connection.close();
    
            }
            long end = System.currentTimeMillis();
            System.out.println("花费时间为:" + (end - start));
        }
    }
    
    输出:
    oracle.jdbc.driver.T4CConnection@1b0375b3
    oracle.jdbc.driver.T4CConnection@2f7c7260
    oracle.jdbc.driver.T4CConnection@2d209079
    oracle.jdbc.driver.T4CConnection@6bdf28bb
    oracle.jdbc.driver.T4CConnection@6b71769e
    ......
    花费时间为:3176

    可以看到每个链接地址都不同,且耗时长

    二.  Druid

    再来看一下使用Druid后,创建1链接耗时:

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidPooledConnection;
    import com.oaec.day08.util.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    
    public class Test {
      
        public static void main(String[] args) throws SQLException {
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
            druidDataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
            druidDataSource.setUsername("book");
            druidDataSource.setPassword("zhangjia");
            DruidPooledConnection connection = druidDataSource.getConnection();
            connection.close();//记得加上
            long start = System.currentTimeMillis();
            for (int i = 0; i < 100; i++) {
    
                connection = druidDataSource.getConnection();
                System.out.println("conn = " + connection);
                connection.close();
            }
            long end = System.currentTimeMillis();
            System.out.println("花费时间为:" + (end - start));
        }
    }
    
    输出:
    connection = oracle.jdbc.driver.T4CConnection@6fe2ac7f
    conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
    conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
    conn = oracle.jdbc.driver.T4CConnection@6fe2ac7f
    ......
    花费时间为:29

    可以看到始终是一个链接,且耗时短

    三.  使用Druid优化之前的JDBCUtils

    首先来看一下优化之前的JDBCUtils:

    package com.oaec.day07.util;
    
    import java.sql.*;
    
    /**
     * JDBC的工具类,负责:加载驱动,建立连接,释放资源
     *
     */
    public class JDBCUtils {
    
    	private static final String DRIVER = "oracle.jdbc.OracleDriver";
    	private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
    	
    	private static final String USER = "book";
    	private static final String PASSWORD = "zhangjia";
    
    	static {
    		// 因为驱动只需要加载一次,所以在静态语句块中进行加载
    		try {
    			Class.forName(DRIVER);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 建立和数据库的连接
    	 * 
    	 * @return 连接
    	 */
    	public Connection getConnection() {
    		try {
    			Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
    			return connection;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 释放资源
    	 * 
    	 * @param rs
    	 *            结果集
    	 * @param stm
    	 *            语句对象
    	 * @param conn
    	 *            连接
    	 */
    	public void close(ResultSet rs, Statement stm, Connection conn) {
    		try {
    			// 关闭结果集
    			if (rs != null && !rs.isClosed()) {
    				rs.close();
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				// 关闭语句对象
    				if (stm != null && !stm.isClosed()) {
    					stm.close();
    				}
    			} catch (SQLException e) {
    				e.printStackTrace();
    			} finally {
    				try {
    					// 关闭连接
    					if (conn != null && !conn.isClosed()) {
    						conn.close();
    					}
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	/**
    	 * 释放资源
    	 * 
    	 * @param stm
    	 *            语句对象
    	 * @param conn
    	 *            连接
    	 */
    	public void close(Statement stm, Connection conn) {
    		close(null, stm, conn);
    	}
    
    }

    既然有了Druid,我们JDBCUtils中的getConnection方法中的操作便可以使用Druid来替换,

    public class JDBCUtils {
    
    	/**
    	 * 建立和数据库的连接
    	 * 
    	 * @return 连接
    	 */
    	public Connection getConnection() {
    		try {
    			    DruidDataSource druidDataSource = new DruidDataSource();
                                druidDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
                                druidDataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
                                druidDataSource.setUsername("book");
                                druidDataSource.setPassword("zhangjia");
                                DruidPooledConnection conn=dataSource.getConnection();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	....
    }

    但是这样会存在一个问题,因为我们每次获取链接的时候都会执行try中的代码,但是Druid在第一次建立连接的时候,因为要建立的是连接池,会非常的慢,所以上面的代码虽然用Druid替换了之前的代码,但是效率却降低了,所以我们需要想办法执行getConnection的时候,连接池只创建一次,也就是只需要一个DruidDataSource 对象,可以通过单例模式来解决:

    首先编写JDBCDataSource 类,用于返回一个DruidDataSource 对象

    public class JDBCDataSource {
        private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
        private static final String USERNAME = "book";
        private static final String PASSWORD = "zhangjia";
        private static DruidDataSource dataSource;
        //setDriverClassName可以不设置,当不设置驱动类名时,会根据url自动设置
        static {
            dataSource = new DruidDataSource();
            dataSource.setUrl(URL);
            dataSource.setUsername(USERNAME);
            dataSource.setPassword(PASSWORD);
        }
    
        public static DruidDataSource getDataSource() {
            return dataSource;
        }
    }

    接下来,直接在JDBCUtils里调用JDBCDataSource 类的dataSource对象即可。

    import com.oaec.day08.jdbc.JDBCDataSource;
    
    import java.sql.*;
    
    /**
     * JDBC的工具类,负责:加载驱动,建立连接,释放资源
     *
     */
    public class JDBCUtils {
    
    
       /**
        * 建立和数据库的连接
        * 
        * @return 连接
        */
       public Connection getConnection() {
          try {
             return JDBCDataSource.getDataSource().getConnection();
          } catch (SQLException e) {
             e.printStackTrace();
          }
          return null;
       }
    
       /**
        * 释放资源
        * 
        * @param rs
        *            结果集
        * @param stm
        *            语句对象
        * @param conn
        *            连接
        */
       public void close(ResultSet rs, Statement stm, Connection conn) {
          try {
             // 关闭结果集
             if (rs != null && !rs.isClosed()) {
                rs.close();
             }
          } catch (SQLException e) {
             e.printStackTrace();
          } finally {
             try {
                // 关闭语句对象
                if (stm != null && !stm.isClosed()) {
                   stm.close();
                }
             } catch (SQLException e) {
                e.printStackTrace();
             } finally {
                try {
                   // 关闭连接
                   if (conn != null && !conn.isClosed()) {
                      conn.close();
                   }
                } catch (SQLException e) {
                   e.printStackTrace();
                }
             }
          }
       }
    
       /**
        * 释放资源
        * 
        * @param stm
        *            语句对象
        * @param conn
        *            连接
        */
       public void close(Statement stm, Connection conn) {
          close(null, stm, conn);
       }
    
    }

    山东省
  • 0
  • 0
  • 0
  • 2k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: