Skip to content

连接池

前面每次操作数据库都要重新获取连接,使用完毕就 close() 进行释放,频繁的创建和销毁造成资源浪费,同时对服务器压力巨大。

连接池就是数据库连接对象的缓冲区,通过配置,由连接池负责创建连接、管理连接、释放连接等操作。

预先创建数据库连接放入连接池,用户在请求时,通过连接池直接获取连接,使用完毕后将连接放回池中,避免了频繁的创建和销毁,提供性能。

当池中无连接可用时,且未达到上限时,连接池会新建连接。池中连接达到上限时,用户请求会等待,可以设置超时时间。

常见的连接池

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

目前最主流的连接有:

  • Druid(德鲁伊):阿里巴巴提供的数据库连接池,是集 DBCP、C3P0、Proxool 优点于一身的连接池,性能、扩展性、易用性都更好,功能丰富;
  • Hikari(shi ga li):是 SpringBoot2.x 之后就内置的数据库连接池,基于 BnoeCP 做了优化处理,效率超高;
连接池对比

Druid

Druid下载地址:Druid历史版本下载

硬编码使用

java
@Test
public void testHardDruid() throws SQLException {
  // 1、创建 DruidDataSource 连接池对象
  DruidDataSource druidDataSource = new DruidDataSource();

  // 2、设置连接池的配置信息
  // 2.1 必填配置
  druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
  druidDataSource.setUrl("jdbc:mysql:///atguigu");
  druidDataSource.setUsername("root");
  druidDataSource.setPassword("1234");
  // 2.2 非必填配置
  druidDataSource.setInitialSize(10); // 默认创建连接池 10 个连接
  druidDataSource.setMaxActive(20);   // 最大连接个数 20 个

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

  // 4、执行增删改查操作

  // 5、回收连接(虽然是close,但是不是销毁而是回收)
  connection.close();
}

软编码使用

所谓软编码,就是将一些配置信息,写入配置文件,然后再 java 类中再进行读取。

java
@Test
public void testSoftDruid() throws Exception {
  // 1、创建 Properties 集合,用于存储外部配置文件的key和value值
  Properties properties = new Properties();
  // 2、读取配置文件,获取输入流,加载到 Properties 中
  InputStream resourceAsStream
    = DruidTest.class.getClassLoader().getResourceAsStream("db.properties");
  properties.load(resourceAsStream);

  // 3、基于 Properties 集合构建 DruidDataSource 连接池
  DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  // 4、通过连接池获取连接对象
  Connection connection = dataSource.getConnection();

  // 5、执行增删改查

  // 6、资源回收
  connection.close();
}
properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/atguigu
username=root
password=1234
initialSize=10
maxActive=20

HikariCP

HikariCP下载地址:HikariCP下载地址

slf4j下载地址:slf4j-api下载地址

硬编码使用

java
@Test
public void testHardHikariCP() throws SQLException {
  // 1、创建 HikariDataSource 连接池对象
  HikariDataSource hikariDataSource = new HikariDataSource();

  // 2、设置连接池的配置信息
  // 2.1 必填的配置
  hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
  hikariDataSource.setJdbcUrl("jdbc:mysql:///atguigu");
  hikariDataSource.setUsername("root");
  hikariDataSource.setPassword("1234");
  // 2.2 可选的配置
  hikariDataSource.setMinimumIdle(10);
  hikariDataSource.setMaximumPoolSize(20);

  // 3、通过连接池获取连接对象
  Connection connection = hikariDataSource.getConnection();
  System.out.println(connection);

  // 4、执行增删改查

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

软编码使用

java
@Test
public void testSoftHikariCP() throws IOException, SQLException {
  // 1、创建 Properties 集合,存储外部配置文件的key和value值
  Properties properties = new Properties();
  // 2、读取外部配置文件,获取输入流,加载到 Properties 集合里
  InputStream resourceAsStream 
    = HikariCPTest.class.getClassLoader().getResourceAsStream("hikari.properties");
  properties.load(resourceAsStream);

  // 3、创建 HikariConfig 连接池配置对象
  HikariConfig hikariConfig = new HikariConfig(properties);
  // 4、基于 HikariConfig 连接池配置对象,构建 HikariDataSource
  HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);

  // 5、获取连接
  Connection connection = hikariDataSource.getConnection();
  System.out.println(connection);

  // 6、执行增删改查

  // 7、回收连接
  connection.close();
}
properties
driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/atguigu
username=root
password=1234
minimumIdle=10
maximumPoolSize=20

Released under the MIT License.