本文主要讲述使用druid连接池,将jdbc封装成工具类

一. 连接池

vip

 二. 使用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连接。