Java -- JDBC学习笔记8、连接池

1、Druid连接池

在程序初始化时,预先创建指定数量的数据库连接对象存储在池中,当需要连接数据库时,从连接池中取出,现有连接使用完毕后,也不会进行关闭,而是放回池中实现复用,节省资源.

1.1、Druid连接池使用步骤

  • 在项目的lib文件夹里添加druid.jar文件
  • 创建database.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/StudentManage?characterEncoding=utf-8&useSSL=false
username=root
password=root
#初始化连接数
initialSize=10
#最大连接数量
maxActive=50
#最小连接数量
minIdle=5
#超时等待时间以毫秒为单位
maxWait=3000
  • 连接池工具类
public class DBUtils
{
    //声明连接池对象
    private static DruidDataSource ds;

    static
    {
        Properties properties = new Properties();
        try
        {
            //加载配置文件
            properties.load(DBUtils.class.getResourceAsStream("/database.properties"));
            //使用DruidDataSourceFactory创建连接池.createDataSource(),参数类型是Properties
            ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    /**
     * 从池中获取连接对象
     * @return 连接对象
     */
    public static Connection getConnection()
    {
        try
        {
            return ds.getConnection();
        }
        catch (SQLException sqlException)
        {
            sqlException.printStackTrace();
        }
        return null;
    }
}
  • 在main方法中测试,每次调用后就放回池中
for (int i = 0; i < 10; i++)
        {
            Connection conn = DBUtils.getConnection();
            System.out.println(conn);
            //将连接对象放回到池中
            conn.close();
        }
  • 结果:
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30
com.mysql.jdbc.JDBC4Connection@71c7db30

可以看到、用的都是一个对象,每次用完都放回到池中,下次用就再取,节省资源、实现复用。

  • 注:这里边的conn.close()和Connection中close()不一样,不是释放资源,因为这里获取的conn是从连接池中获取的,在ds.getConnection()中按Ctrl键在getConnection()上边点击鼠标左键查看源码,可以看到一下代码:
public DruidPooledConnection getConnection() throws SQLException {
        return this.getConnection(this.maxWait);
    }
  • 以同样方法再点击DruidPooledConnection可以看到:
public class DruidPooledConnection extends PoolableWrapper implements PooledConnection, Connection {
    //........
}

可以看到、DruidPooledConnection实现了Connection接口,而以上循环中使用的conn.close()就是这里边的close(),可以说是被加工了,功能是将连接对象放回到池中,而不是释放掉。

原文地址:https://www.cnblogs.com/dcy521/p/14732864.html