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多了一个步骤