摘要:本文学习了如何使用连接池管理连接。
环境
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.properties1 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
|
示例:
java1 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.properties1 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
|
示例:
java1 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(); }
|
条