使用 HikariCP 实现连接池
高效复用连接
使用 HikariCP 实现连接池 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
为什么要使用连接池
打开数据库连接的成本很高:TCP 握手、身份验证和会话设置可能需要几十毫秒。
连接池会保留一组已经打开、随时可用的连接。您的代码借用一个连接,使用后再归还,从而将昂贵的打开操作变成廉价的取用操作。
认识 HikariCP
HikariCP 是 Java 连接池的事实标准。它体积小、速度快,也是 Spring Boot 中的默认连接池。
它实现了 javax.sql.DataSource,因此其余 JDBC 代码无需改变——您只需从连接池获取连接,而不是使用 DriverManager。
配置连接池
您可以使用 HikariConfig 对象配置 HikariCP:JDBC URL、凭据和连接池大小。
然后根据它创建 HikariDataSource。通常应在应用程序启动时创建一次,并在应用程序中共享。
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class Main {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
config.setUsername("app");
config.setPassword("secret");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
ds.close();
}
}借用连接
调用 ds.getConnection() 借用连接。像往常一样,将它放在 try-with-resources 中。
这里的关键点是:关闭连接池中的连接不会关闭物理套接字,而是将连接归还到连接池以便重复使用。
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
public class Main {
public static void main(String[] args) {
DataSource ds = new HikariDataSource();
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) System.out.println("Users: " + rs.getInt(1));
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}close() 表示归还
这一点经常让开发人员困惑。使用连接池时:
conn.close()会将连接归还到连接池。- 连接池会保持真实套接字打开,供下一个借用者使用。
因此,您仍然应该始终关闭连接——try-with-resources 是正确的做法。您是在归还连接,而不是销毁连接。
连接池大小
连接池并不是越大越好。过大的连接池会让数据库承受过多的并发操作。
HikariCP 的建议是使用较小的连接池,通常 (core_count * 2) + effective_spindle_count 左右的大小往往优于庞大的连接池。maximumPoolSize 是上限;minimumIdle 会保持少量连接处于预热状态。
public class Main {
public static void main(String[] args) {
int cores = 4;
int spindles = 1; // SSD-ish
int recommended = (cores * 2) + spindles;
System.out.println("Suggested max pool size: " + recommended);
}
}关键超时设置
HikariCP 提供了多种超时设置,用于保护应用程序免受数据库卡住的影响:
connectionTimeout——借用连接在失败前等待的时间(默认 30 秒)。idleTimeout——空闲连接可以保持的时间。maxLifetime——连接达到此使用时长后将被回收(应将其设置为低于数据库自身的超时时间)。
连接验证
网络可能会悄无声息地断开连接。在将连接交给使用者之前,HikariCP 可以对其进行验证。
现代 JDBC 驱动程序使用 Connection.isValid(timeout);HikariCP 会自动调用它。对于不支持 isValid 的旧驱动程序,您也可以设置 connectionTestQuery。
泄漏检测
当代码借用连接却始终不关闭时,就会发生连接泄漏——最终连接池会耗尽,所有借用请求都会超时。
设置 leakDetectionThreshold(例如 20000 毫秒)后,HikariCP 会为持有时间超过该阈值的连接记录堆栈跟踪,直接指出出现问题的代码。
每个应用程序使用一个连接池
创建一次 HikariDataSource,并在整个应用程序生命周期内重复使用它。
为每个请求创建新的连接池会违背连接池的目的——您每次都要承担启动成本。只在应用程序关闭时使用 ds.close() 关闭连接池。
监控连接池
HikariCP 提供运行时指标,便于您监控连接池的健康状况。
- 活动连接、空闲连接和连接总数。
- 当前等待连接的线程数。
它可以与 Micrometer、Dropwizard 指标和 JMX 集成。持续较高的“等待”数量表示连接池太小,或者连接被持有的时间过长。
快速检查
使用 HikariCP 时,对借用的连接调用 close() 会产生什么效果?
回顾
HikariCP 让连接重复使用更加高效:
- 在启动时配置一次
HikariDataSource。 - 在 try-with-resources 中使用
getConnection()借用连接;close()会将连接归还到连接池。 - 将
maximumPoolSize保持在适中的大小。 - 调整
connectionTimeout、maxLifetime和连接验证设置。 - 使用
leakDetectionThreshold捕获未归还的连接。
常见问题解答
「使用 HikariCP 实现连接池」课时是免费的吗?
是的 — 「使用 HikariCP 实现连接池」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「使用 HikariCP 实现连接池」这节课中我会学到什么?
高效复用连接 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 HikariCP 实现连接池」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- JDBC 基础
- PreparedStatement
- 事务
- 使用 HikariCP 实现连接池