分类 | 说明 |
---|---|
名称 | DBCP |
全称 | Database Connection Pool |
功能 | 数据库连接池 |
连接池
数据库连接池是一种关键有限且昂贵的资源,对数据库连接的管理能显著影响整个应用程序的伸缩性和健壮性,是影响程序的性能指标。
数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。通过释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引发的数据库连接遗漏。
数据库连接池的基本思想是在系统初始化时,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。当使用完毕后,用户也并非将连接关闭,而是将连接放回到连接池中,供下一个请求访问使用。因此连接的建立、断开都是由连接池自身来管理的。同时,可通过设置连接池参数来控制连接池中初始连接数,连接的上下限数、每个连接的最大使用次数、最大空闲时间等,通过自身的管理机制来监视数据库连接的数量和使用情况等。
DBCP
- DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池
- DBCP是一个开源的连接池,是Apache Common成员之一,企业开发中常见,是Tomcat内置的连接池。
- Spring开发组推荐使用DBCP,阿里的Druid也是参照DBCP开发而来的。
- DBCP支持通过JNDI获取数据库,并支持JTA或XA事务中用于2PC(两阶段提交)的连接对象。
下载地址 http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
配置参数 http://commons.apache.org/proper/commons-dbcp/configuration.html
接口文档 https://tool.oschina.net/apidocs/apidoc?api=dbcp
依赖
Maven项目导入DBCP依赖
$ vim pom.xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.6.0</version>
</dependency>
commons-dbcp2
包依赖于commons-pool2
包提供的底层对象池机制。
DBCP现有三种不同版本,支持不同版本的JDBC。
DBCP | JDBC | Java |
---|---|---|
DBCP2 | JDBC4.1 | Java7 |
DBCP1.4 | JDBC4 | Java6 |
DBCP1.3 | JDBC3 | Java1.4.5 |
使用步骤
- 创建配置文件dbcp.properties用于设置数据库连接参数和连接池参数等。
- 使用BasicDataSourceFactory加载dbcp.properties文件以获取BasicDataSource对象
- 使用BasicDataSource对象获取Connection连接对象
- 使用Connection连接对象对数据表操作
配置文件
$ vim resources/dbcp.properties
#连接基本属性
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/fw?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
connectionProperties=useUnicode=true;characterEncoding=utf8
username=root
password=root
#连接池大小和连接超时参数
initialSize=0
maxTotal=8
maxIdle=8
minIdle=0
maxWaitMillis=-1
基本配置 | 说明 |
---|---|
driverClassName=com.mysql.cj.jdbc.Driver | 要使用的JDBC驱动程序的完全限定的Java类名称 |
url=xxx | 连接的路径,通过驱动创建所需的连接。 |
connectionProperties | JDBC驱动建立连接时附带的连接属性,属性格式[属性名=property;] 。 |
username=root | 连接的用户名,通过驱动创建需的连接。 |
password=root | 连接的密码,通过驱动创建所需的连接。 |
连接池 | 说明 |
---|---|
initialSize=0 | 初始化连接数量,连接池启动时创建的。 |
maxTotal=8 | 最大活动连接数量,连接池在同一时间能够分配的最大活动连接的数量, 负数表示不限制。 |
maxIdle=8 | 最大空闲连接,连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,负数表示不限制。 |
minIdle=0 | 最小空闲连接,连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,0表示不创建。 |
maxWaitMillis=-1 | 最大等待毫秒时间,当没有可用连接时,连接池等待连接被归还的最大时间,超过则抛出异常,小于等于0表示无限等待。 |
工具类
$ vim util/DBCPUtil.java
package com.jc.util;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class DBCPUtil {
private static DataSource ds = null;
static {
//导入配置文件
Properties p = new Properties();
InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
p.load(is);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
//获取数据源
try {
ds = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private static DataSource getDataSource(){
return ds;
}
//获取连接
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
//释放连接返还连接池
public static void release(Connection conn, Statement stmt, ResultSet rs){
if(rs != null){
try{
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null){
try{
stmt.close();
}catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try{
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}
测试
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBCPUtil.getConnection();
System.out.println(conn);
String sql = "SELECT * FROM sys_user WHERE 1=1 AND id = ?";
ps = conn.prepareStatement(sql);
System.out.println(ps);
ps.setString(1, "4");
rs = ps.executeQuery();
System.out.println(rs);
while(rs.next()){
System.out.println(rs.getString("id"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBCPUtil.release(conn, ps, rs);
}