数据库连接池
1. 概念
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。(来自:百度百科数据库连接池)。实质上,数据库连接池,就是一个用来存放数据库连接(Connection)的容器(集合),当系统初始化后,容器就会被创建,并且申请号一些数据库连接存放在容器中,当用户访问数据库时,从容器中获取数据库连接,访问完之后,就会归还连接对象给容器。
2. 好处
- 节约资源
- 提高访问数据库效率
3. 实现
- 标准接口:java.sql.DataSource接口
- 方法:
- 该接口有一个方法用来获取连接:getConnection()
- 归还连接对象:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法来归还。(注意:在这种技术下,不是关闭连接而是归还连接)
- 方法:
- 该接口一般不用程序员自己实现,可以使用数据库厂商的实现,有两种主要的数据库连接池技术
- C3P0:数据库连接池技术
- Druid:Alibaba提供的数据库连接池技术
4. C3P0
步骤:
- 导入jar包:c3p0-0.9.5.2.jar 以及mchange-commons-java-0.2.12.jar,同时由于要连接数据库,不要忘了打入驱动jar包
- 定义配置文件:
- 文件名:c3p0.properties or c3p0-config.xml,将文件名定义为这两个,会自动寻找这两个名字的文件
- 直接文件放置于scr目录下即可
- 创建核心对象,也就是数据库连接池对象:ComboPooledDataSource对象
- 获取连接:getConnection()
C3P0Demo:
package cn.zhuobo.dataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo02 {
public static void main(String[] args) throws SQLException {
// 默认版本的数据库连接池,ComboPooledDataSource()没有参数
/*DataSource dataSource = new ComboPooledDataSource();
for (int i = 0; i < 11; i++) {
Connection connection = dataSource.getConnection();
System.out.println(i + ":" + connection);
if(i == 3) {
connection.close();// 归还连接
}
}*/
testNamedConfig();
}
//这是另一个版本的数据库连接池,带有参数,查看配置文件可以知道,该连接池的最大连接对象为8
// ComboPooledDataSource()有参数
public static void testNamedConfig() throws SQLException {
DataSource dataSource1 = new ComboPooledDataSource("otherc3p0");
for (int i = 0; i < 9; i++) {
Connection connection = dataSource1.getConnection();
System.out.println(i + ":" + connection);
}
}
}
5.Druid:Alibaba提供的数据库连接池技术
使用步骤:
- 导入jar包:
- 定义配置文件:
- 是Properties格式的
- 可以为任意的名称,放在任意的目录下
- 加载配置文件 Properties文件
- 获取连接池对象:使用工厂类获取
DruidDataSourceFactory.createDataSource(pro);
- 获取连接,连接池对象.getConnection();
DruidDemo:
package cn.zhuobo.dataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo01 {
public static void main(String[] args) throws Exception {
// 加载配置文件,classLoader还需要深入了解一下
Properties pro = new Properties();
InputStream is = DruidDemo01.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
// 获取连接对象
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
一般还是自己定义一个工具类,用来加载配置文件,初始化连接池,释放资源等
- 定义一个类JDBCUtils
- 在一个静态代码块里编写加载配置文件
- 方法:
- 获取连接的方法::通过数据库连接池获取连接
- 释放资源的方法
- 获取连接池的方法