文章目录
一.连接池是什么?
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的 线程 使用。 这种连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的 事务 时,仅需要能够访问 JDBC 连接的 1 个线程。 当不处理事务时,这个连接就会闲置。 相反,连接池允许闲置的连接被其它需要的线程使用。 事实上,当一个线程需要用 JDBC 对一个 GBase 或其它数据库操作时,它从池中请求一个连接。 当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。 当连接从池中“借出”,它被请求它的 线程 专有地使用。
二.连接池的优点
2.1 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统开销的基础之上,也增进了系统运行环境的稳定性。
2.2 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
2.3 分配新资源的手段
对于多应用共享同一数据库而言,可在应用层通过数据库连接的配置。
2.4 统一连接管理,避免数据库连接泄露
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。
三.连接池的四种常见配置方式
3.1 C3P0数据库连接池
C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以,hibernate官方推荐使用。
- 导入jar包
主要是C3P0和MySQL的jar包。
- 配置XML文件
在连接数据库中可以直接使用。
c3p0-config.xml文件:
<c3p0-config>
<!--使用默认的配置读取数据库连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/work121DB?useServerPrepStmts=true</property>
<property name="user">root</property>
<property name="password">ww121212</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<c3p0-config>
- 连接数据库开始使用
C3P0连接池中已经设置了其配置,所以直接使用ComboPooledDataSource来生成实例,
根据实例调用信息,连接数据库。
public static void main(String[] args) {
//使用ComboPooledDataSource来生成dataSource的实例
ComboPooledDataSource dataSource=new ComboPooledDataSource();
try {
//连接数据库
Connection con=dataSource.getConnection();
//创建SQL语句
String sql="select * from student";
//创建命令并执行命令
PreparedStatement pre=con.prepareStatement(sql);
ResultSet rs=pre.executeQuery();
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
String birth=rs.getString(3);
String sex=rs.getString(4);
System.out.println("id:"+id+"\t姓名:"+name+"\t出生日期:"+birth+"\t性别:"+sex);
}
//关闭资源
rs.close();
pre.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
3.2 Druid(德鲁伊)数据库连接池
Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool优点于一身的数据库连接池,但是速度不确定是否有BoneCP快。
- 导入jar包
- 创建一个配置文件
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/work122DB
username = root
password = ww121212
initialSize = 10
maxActive = 30
maxWait = 1000
- 加载配置文件使用
public static void main(String[] args) throws Exception {
//加载配置文件
Properties properties=new Properties();
properties.load(new FileInputStream("src/a/jdbc.properties"));
//获取数据库连接池对象
DataSource dataSource= DruidDataSourceFactory.createDataSource(properties);
//获取连接
Connection con=dataSource.getConnection();
System.out.println(con);
}
3.3 DBCP数据库连接池
DBCP 是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
- 先引入DBCP的jar包:
2. 设置配置文件
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8
#url=jdbc:mysql://localhost:3306/db1??useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username=root
password=12345
#初始化连接
initialSize=5
#最大空闲连接
maxIdle=10
#最大等待时间
maxWait=3000
获取连接使用:
//加载配置文件
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/2023StudentDB");
dataSource.setUsername("root");
dataSource.setPassword("ww121212");
Connection conn = dataSource.getConnection();
3.4 HikariCP数据库连接池
HikariCP是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。根据官方提供的数据,在i7,开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方也是推荐使用HikariCP
- 导入jar包
2.创建一个配置文件
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8
#url=jdbc:mysql://localhost:3306/db1??useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username=root
password=12345
#初始化连接
initialSize=5
#最大空闲连接
maxIdle=10
#最大等待时间
maxWait=3000
- 获取连接使用
//获取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src\\database.properties"));
//将获取到的配置文件进行初始化配置
HikariConfig config = new HikariConfig(properties);
//创建HikariDataSource数据源
HikariDataSource dataSource = new HikariDataSource(config);
//从数据源获取连接
Connection conn = dataSource.getConnection();