抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用连接池管理连接。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8
MySQL 5.7.40

1 背景

1.1 现有问题

每次操作数据库都要建立连接,并将得到的Connection对象加载到内存中,如果短时间有大量建立连接的操作,会导致占用很多系统资源,甚至会导致服务器崩溃。

每次使用结束都需要手动释放连接,如果忘记释放连接或者程序出现异常未能成功释放,会导致内存泄露。

不能控制连接的数量,如果连接的人数过多,会导致无限制的创建连接对象,导致内存开销过大,服务器崩溃。

1.2 简介

连接池就是数据库连接对象的缓冲区,负责创建连接、管理连接、释放连接等操作。

每次需要连接数据库时,不需要建立连接,而是通过连接池获取。

在使用完连接后,不需要手动释放连接,而是交由连接池释放。

可以通过连接池控制连接的数量,在连接池里的连接可多次重复使用,避免了无限制创建连接的问题。

2 选用

2.1 使用Druid连接池

2.1.1 介绍

Druid是阿里巴巴开发的一个高性能、可扩展、可监控的开源JDBC连接池。

2.1.2 使用

下载Jar包:

将下载的druid-1.2.20.jar文件复制到lib目录。

配置文件内容:

jdbc.properties
1
2
3
4
5
6
7
8
9
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8
username=root
password=123456

# 初始化连接数
initialSize=10
# 最大连接数
maxActive=20

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 为了代码阅读简洁,直接抛出异常
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 获取连接
Connection conn = dataSource.getConnection();
// 获取预编译执行器
String sql = "select * from user where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
// 设置参数
ps.setInt(1, 1);
// 执行查询,获取结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + "-" + rs.getString(2) + "-" + rs.getString(3));
}
// 关闭结果集
rs.close();
// 关闭执行器
ps.close();
// 释放连接
conn.close();
}

2.2 使用HikariCP连接池

2.2.1 介绍

HikariCP是一个轻量级、高效的JDBC连接池,具有快速启动和低延迟的特点。

2.2.2 使用

下载Jar包:

将下载的HikariCP-4.0.3.jar文件复制到lib目录。

因为HikariCP依赖了SLF4J日志,所以还需要下载日志文件并复制到lib目录:

  • slf4j-api-1.7.26.jar
  • logback-classic-1.2.3.jar
  • logback-core-1.2.3.jar

配置文件内容:

jdbc.properties
1
2
3
4
5
6
7
8
9
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8
username=root
password=123456

# 最小空闲连接数
minimumIdle=10
# 最大连接数
maximumPoolSize=20

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 为了代码阅读简洁,直接抛出异常
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池配置对象
HikariConfig hikariConfig = new HikariConfig(pros);
// 创建连接池
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
// 获取连接
Connection conn = dataSource.getConnection();
// 获取预编译执行器
String sql = "select * from user where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
// 设置参数
ps.setInt(1, 1);
// 执行查询,获取结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + "-" + rs.getString(2) + "-" + rs.getString(3));
}
// 关闭结果集
rs.close();
// 关闭执行器
ps.close();
// 释放连接
conn.close();
}

评论