JDBC-连接池
如果每次要操作数据库时都获取新的链接,使用完毕就释放掉资源,会频繁的创建和销毁,造成资源的浪费
- 连接池就是数据库连接对象的缓冲区,通过配置,由连接池负责创建连接、管理连接、释放连接等操作
- 预先创建连接,放到连接池中,用户在请求时,从连接池中获取连接,使用完毕后,将连接放回连接池中
- 当池中无连接可用(未达到连接池上限),连接池会新建连接
- 当池中无连接可用(达到连接池上限),用户会请求等待,可以设置超时时间
常见的连接池
JDBC的数据库连接池使用javax.sql.DataSource 接口进行规范,所有第三方连接池都实现了此接口
所有连接池的获取和回收方法都相同,不同的只有扩展功能和性能
Druid扩展性要比Hikari更强,但Hikari的性能是Druid的三倍
配置Druid连接池
- 使用new DruidDataSource()新建连接池对象
- 使用setXxx方法配置连接池
- 使用getConnection()获取连接,进行CRUD
- 使用close()回收连接
使用硬编码方式创建Druid连接池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Test public void testHardCodeDruid() throws SQLException { DruidDataSource druidDataSource = new DruidDataSource();
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.close(); }
|
注:这里的close不再是释放资源,而是把这个数据库连接回收到连接池中
使用Properties配置创建Druid(软编码方式)
1 2 3 4 5 6
| driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://192.168.2.2:3306/xiaobai username=root password=Zhuwenxue2002 initialSize=5 maxActive=20
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void testSoftCodeDruid() throws Exception { Properties properties = new Properties(); InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("db.properties"); properties.load(resourceAsStream);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
connection.close(); }
|
配置Hikari连接池
总的来说,Hikari与Druid在使用上并没有什么本质的不同
需要注意的是:在setXXX配置文件时,有一些配置属性名时不同的,例如Url 与 JdbcUrl
使用硬编码方式创建Hikari连接池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Test public void testHardCodeHikari() throws SQLException { HikariDataSource hikariDataSource = new HikariDataSource(); 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(软编码方式)
1 2 3 4 5 6
| driverClassName=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://192.168.2.2:3306/xiaobai username=root password=Zhuwenxue2002 minimumIdle=5 maximumPoolSize=20
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Test public void testSoftCodeHikari() throws Exception { Properties properties = new Properties(); InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("db.properties"); properties.load(resourceAsStream);
HikariConfig hikariConfig = new HikariConfig(properties);
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig); Connection connection = hikariDataSource.getConnection(); connection.close(); }
|
注:在读取properties集合的配置信息时,Hikari需要先实例化一个hikariConfig对象,这比Druid多了一个步骤