连接池
2024年11月17日大约 2 分钟
自定义连接池
前置条件
- 连接池必须实现
javax.sql.DataSource
接口 - 连接池返回的
Connection
对象,它的close()
不是关闭连接而是把连接归还到连接池
模板
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
public class MyDataSource implements DataSource {
// 创建一个集合用于保存连接
LinkedList<Connection> list = new LinkedList<>();
// 构造循环创建10条连接存入集合
public MyDataSource() {
for (int i = 0; i < 10; i++) {
try {
list.add(JdbcUtils.getConnection());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
// 调用close方法归还连接
public void close(Connection connection) {
list.add(connection);
System.out.println("还剩" + list.size());
}
// 获取连接
@Override
public Connection getConnection() {
Connection connection = list.removeFirst();
System.out.println("还剩" + list.size());
return connection;
}
// @Override···
}
druid(德鲁伊)连接池
项目地址:https://github.com/alibaba/druid
Maven项目
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.20</version> </dependency>
测试连接是否有效
public void testGetConnection() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/数据库名");
dataSource.setUsername("数据库账号");
dataSource.setPassword("数据库密码");
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
配置文件(druid.properties)
# 驱动
driverClassName=com.mysql.jdbc.Driver
# 连接数据库的连接
url=jdbc:mysql://localhost:3306/数据库名
# 数据库用户户名
username=数据库账号
# 数据库密码
password=数据库密码
# 初始连接数
initialSize=5
# 最大连接池数量
maxActive=10
# 最小连接池数量
minIdle=1
# 最大等待时间(毫秒)
maxWait=3000
用于德鲁伊连接池的常用配置
封装DruidUtils的工具类
public class DruidUtils {
private static DataSource dataSource;
// 创建连接池
static {
try {
// 获取流
InputStream resourceAsStream = DruidUtils.class.getResourceAsStream("druid.properties");
Properties properties = new Properties();
// 加载配置文件
properties.load(resourceAsStream);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 获取连接池对象
public static DataSource getDataSource() {
return dataSource;
}
// 获取连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
// 释放资源
public void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
if (resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
if (resultSet != null)
try {
preparedStatement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
if (connection != null)
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void close(PreparedStatement preparedStatement, Connection connection) {
close(null, preparedStatement, connection);
}
}
SpringBoot3 整合
pom依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
编写yml配置文件
spring:
datasource:
# 使用Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.sqlpub.com:3306/xxx
username:
password:
# 编写Druid配置
druid:
# 初始化连接数
initial-size: 8
# 最大连接数
max-active: 16
# 最小空闲数量
min-idle: 8
# 连接时最大等待事件(毫秒)
max-wait: 60000
test-while-idle: true
test-on-borrow: false
test-on-return: false