一. 原方法
首先使用之前的方法,计算一下创建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); } }
请登录之后再进行评论