- 连接池技术的简介
常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等,本文介绍以及实现的数据库连接池技术为 DBCP。
DBCP (Database Connection Pool) : 由Apache开发的一个Java数据库连接池项目,Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。 - 连接池技术的原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。
连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 - 连接池的实现
实现环境: jdk 13.0.2 + JavaEE 8 + MySQL 5.7
单独使用dbcp需要3个包:commons-dbcp.jar, commons-pool.jar, commons-collections.jar。
下载链接:commons-dbcp-1.4.jar, commons-pool-1.6.jar, commons-collections4-4.4.jar
jar包、配置文件、DBCP实现类目录结构如下图所示
Project Structure -> libraries 导入jar包如下图所示
配置文件实现
# 数据库地址
dbUrl=jdbc:mysql://127.0.0.1:3306/school?useSSL=FALSE&serverTimezone=UTC&characterEncoding=utf8
# 数据库用户名
userName=root
# 数据库密码
password=990818
# 数据库驱动
driverName=com.mysql.jdbc.Driver
# 初始化连接数
initSize=2
# 可同时连接的最大连接数
maxActive=1
# 最大等待时间
maxWait=3000
# 最大空闲连接数
maxIdle=2
# 最小空闲连接数
minIdle=0
DBCP实现
package com.javaEE.code.class12;
import org.apache.commons.dbcp.BasicDataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
// Database Connection Pool
public class DBCP {
// 数据库连接池
private static BasicDataSource dbcp;
//为不同线程管理连接
private static ThreadLocal<Connection> tl;
//通过配置文件来获取数据库参数
static {
try {
Properties properties = new Properties();
InputStream inputStream = DBCP.class.getClassLoader().getResourceAsStream("com/javaEE/code/class12/Application.properties");
properties.load(inputStream);
inputStream.close();
// 初始化连接池
dbcp = new BasicDataSource();
// 数据库驱动 (Class.forName())
dbcp.setDriverClassName(properties.getProperty("driverName"));
// 数据库url
dbcp.setUrl(properties.getProperty("dbUrl"));
// 数据库用户名
dbcp.setUsername(properties.getProperty("userName"));
// 数据库密码
dbcp.setPassword(properties.getProperty("password"));
// 初始化连接数量
dbcp.setInitialSize(Integer.parseInt(properties.getProperty("initSize")));
// 连接池允许的最大连接数
dbcp.setMaxActive(Integer.parseInt(properties.getProperty("maxActive")));
// 最大等待时间
dbcp.setMaxWait(Integer.parseInt(properties.getProperty("maxWait")));
// 最小空闲数
dbcp.setMinIdle(Integer.parseInt(properties.getProperty("minIdle")));
// 最大空闲数
dbcp.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
// 初始化线程本地
tl = new ThreadLocal<Connection>();
} catch (Exception e) {
e.printStackTrace();
}
}
// 通过连接池获取一个连接
public static Connection getConnection() throws SQLException {
Connection conn = dbcp.getConnection();
tl.set(conn);
return conn;
}
// 归还连接,未关闭
public static void closeConnection() {
try {
Connection conn = tl.get();
if (conn != null) {
conn.close();
tl.remove();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
建立数据库连接时
// 获取连接
Connection connetion = DBCP.getConnection();
归还数据库连接时
// 归还数据库连接
DBCP.closeConnection();