0Pricing
Java Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. JDBC 基础
  2. PreparedStatement
  3. 事务
  4. 使用 HikariCP 实现连接池
← 返回 Java Academy