JDBC-连接池

JDBC-连接池

如果每次要操作数据库时都获取新的链接,使用完毕就释放掉资源,会频繁的创建和销毁,造成资源的浪费

  • 连接池就是数据库连接对象的缓冲区,通过配置,由连接池负责创建连接、管理连接、释放连接等操作
  • 预先创建连接,放到连接池中,用户在请求时,从连接池中获取连接,使用完毕后,将连接放回连接池中
  • 当池中无连接可用(未达到连接池上限),连接池会新建连接
  • 当池中无连接可用(达到连接池上限),用户会请求等待,可以设置超时时间

常见的连接池

JDBC的数据库连接池使用javax.sql.DataSource 接口进行规范,所有第三方连接池都实现了此接口

所有连接池的获取和回收方法都相同,不同的只有扩展功能和性能

  • Druid是阿里提供的数据库连接池,是集百家之长的连接池,性能、扩展性、易用性都更好,功能丰富

  • Hikari,是SpringBoot2.x之后内置的一款连接池,口号是快速、简单、可靠

Druid扩展性要比Hikari更强,但Hikari的性能是Druid的三倍


配置Druid连接池

  • 使用new DruidDataSource()新建连接池对象
  • 使用setXxx方法配置连接池
  • 使用getConnection()获取连接,进行CRUD
  • 使用close()回收连接

使用硬编码方式创建Druid连接池
@Test
public void testHardCodeDruid() throws SQLException {
    //创建Druid连接池对象
    DruidDataSource druidDataSource = new DruidDataSource();

    //连接池的配置信息,设置JDBC连接四大件(必要设置)
    druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    druidDataSource.setUrl("jdbc:mysql://192.168.2.2:3306/xiaobai");
    druidDataSource.setUsername("root");
    druidDataSource.setPassword("Zhuwenxue2002");

    //连接池的配置信息,配置连接池参数(非必要设置)
    druidDataSource.setInitialSize(5);//初始连接池的连接数量(最小数量)
    druidDataSource.setMaxActive(20);//连接池中连接的最大数量

    //通过连接池获取连接对象
    DruidPooledConnection connection = druidDataSource.getConnection();

    //基于connection进行CRUD

    //回收连接
    connection.close();
}

注:这里的close不再是释放资源,而是把这个数据库连接回收到连接池中


使用Properties配置创建Druid(软编码方式)
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://192.168.2.2:3306/xiaobai
username=root
password=Zhuwenxue2002
initialSize=5
maxActive=20
@Test
public void testSoftCodeDruid() throws Exception {
    //创建properties集合,用于存放外部配置信息
    Properties properties = new Properties();
    InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
    properties.load(resourceAsStream);

    //基于Properties集合,构建DruidDateSource连接池
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

    Connection connection = dataSource.getConnection();

    connection.close();
}

配置Hikari连接池

总的来说,Hikari与Druid在使用上并没有什么本质的不同

需要注意的是:在setXXX配置文件时,有一些配置属性名时不同的,例如Url 与 JdbcUrl

使用硬编码方式创建Hikari连接池
@Test
public void testHardCodeHikari() throws SQLException {
    HikariDataSource hikariDataSource = new HikariDataSource();
    //连接池的配置信息,设置JDBC连接四大件(必要设置)
    hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    hikariDataSource.setJdbcUrl("jdbc:mysql://192.168.2.2:3306/xiaobai");
    hikariDataSource.setUsername("root");
    hikariDataSource.setPassword("Zhuwenxue2002");

    //连接池的配置信息,配置连接池参数(非必要设置)
    hikariDataSource.setMinimumIdle(10);//初始连接池的连接数量(最小数量)
    hikariDataSource.setMaximumPoolSize(10);//连接池中连接的最大数量

    //通过连接池获取连接对象
    Connection connection = hikariDataSource.getConnection();
    //回收连接
    connection.close();
}

使用Properties配置创建Hikari(软编码方式)
driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://192.168.2.2:3306/xiaobai
username=root
password=Zhuwenxue2002
minimumIdle=5
maximumPoolSize=20
@Test
public void testSoftCodeHikari() throws Exception {
    //创建properties集合,用于存放外部配置信息
    Properties properties = new Properties();
    InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
    properties.load(resourceAsStream);

    //创建HikariConfig对象
    HikariConfig hikariConfig = new HikariConfig(properties);

    //使用hikariConfig对象调用getDataSource()方法 或者 使用hikariConfig作为参数实例化hikariDataSource对象
    //DataSource dataSource = hikariConfig.getDataSource();
    HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
    
    Connection connection = hikariDataSource.getConnection();
    connection.close();
}

注:在读取properties集合的配置信息时,Hikari需要先实例化一个hikariConfig对象,这比Druid多了一个步骤