jdbc+Druid工具类
本文主要讲述使用druid连接池,将jdbc封装成工具类
一. 连接池
二. 使用druid连接池
在jdbc工具类的基础上,使用druid连接池,增加连接数量。
hsp老师写的方式:
/** * hsp老师jdbcDruidUtils工具类的创建 */ public class JDBCUtilsByDruid { private static Connection connection; static { Properties properties = new Properties(); try { properties.load(new FileInputStream("src\\druid.properties")); DataSource druid = DruidDataSourceFactory.createDataSource(properties); connection = druid.getConnection(); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ return connection; } public static boolean Close(ResultSet resultSet, Statement statement,Connection connection){ try { if(resultSet != null){ resultSet.close(); } if(statement != null){ statement.close(); } if(connection != null){ connection.close(); } } catch (SQLException e) { throw new RuntimeException(); } return true; } }
在 JDBCUtilsByDruid类中,将connection作为静态成员变量。
测试① 连接:
public class TestConnection { private Connection connection; @Test public void test01() throws Exception{ connection = JDBCUtilsByDruid.getConnection(); System.out.println(connection); JDBCUtilsByDruid.Close(null,null,connection); connection = JDBCUtilsByDruid.getConnection(); System.out.println(connection); JDBCUtilsByDruid.Close(null,null,connection); } }
① 运行结果如下:
二月 01, 2023 7:49:57 下午 com.alibaba.druid.pool.DruidDataSource info 信息: {dataSource-1} inited com.mysql.cj.jdbc.ConnectionImpl@49e5f737 closed-conn-1550261631
① 原因分析如下:
在JDBCUtilsByDruid 类中,connection作为静态成员变量使用,static静态代码块随着类的加载而加载,为connection赋值,
在test01()中,第一次关闭了connection,则JDBCUtilsByDruid 类中静态变量connection被关闭了,无法再次连接到数据库了,
由此看出,将connection作为工具类的静态成员变量,并没有体现出数据连接池的特点。
测试② 连接:
public class TestConnection { private Connection connection; @Test public void test02(){ Connection connection1 = JDBCUtilsByDruid.getConnection(); System.out.println("con1: "+connection1); JDBCUtilsByDruid.Close(null,null,connection1); } @Test public void test03(){ Connection connection2 = JDBCUtilsByDruid.getConnection(); System.out.println("con2: "+connection2); JDBCUtilsByDruid.Close(null,null,connection2); } }
② 运行结果如下:
test02():
con1: com.mysql.cj.jdbc.ConnectionImpl@ed7f8b4
test03():
con2: com.mysql.cj.jdbc.ConnectionImpl@ed7f8b4
原因分析如下:在test02()和test03()是两个不同的方法,当test02()关闭连接后,连接回到数据池中,等待其他方法【test03()】使用该连接。
hsp方式总结:针对测试①和测试②,当类 A 使用hsp方式工具类时,对于Connection类的connection的声明,不要将connection声明为A的成员变量,而是要将connection声明在A的方法中。
我自己写的改进方式:
public class JDBCUtilsByDruid { private static DataSource druid; static { Properties properties = new Properties(); try { properties.load(new FileInputStream("src\\druid.properties")); druid = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ Connection connection = null; try { connection = druid.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return connection; } @SuppressWarnings({"all"}) public static boolean Close(ResultSet resultSet, Statement statement,Connection connection){ try { if(resultSet != null){ resultSet.close(); } if(statement != null){ statement.close(); } if(connection != null){ connection.close(); } } catch (SQLException e) { throw new RuntimeException(); } return true; } }
将数据池 druid作为 JDBCUtilsByDruid 的静态成员变量
测试连接:
public class TestConnection { private Connection connection; @Test public void test01() throws Exception{ connection = JDBCUtilsByDruid.getConnection(); System.out.println(connection); JDBCUtilsByDruid.Close(null,null,connection); connection = JDBCUtilsByDruid.getConnection(); System.out.println(connection); JDBCUtilsByDruid.Close(null,null,connection); } }
运行结果如下:
二月 01, 2023 8:51:32 下午 com.alibaba.druid.pool.DruidDataSource info 信息: {dataSource-1} inited com.mysql.cj.jdbc.ConnectionImpl@ed7f8b4 com.mysql.cj.jdbc.ConnectionImpl@ed7f8b4
再次使用连接时,仍然能保持连接。
三. 结论
在使用druid连接池封装jdbc工具类时,应该让数据连接池druid作为静态成员变量,而不是connection连接。