java - 来自 hikaricp 连接池的连接对象

标签 java connection-pooling hikaricp

我正在使用 hikaricp(这可能也适用于任何其他数据库连接池)。我有一个 DBPool 类,我在其中实例化了一个 HikariDataSource(使用 HikariConfig 对象)。我为此 DBPool 使用惰性持有者习惯用法来限制每个 VM 一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每当我通过 DBPool 获取连接引用时,我都会在连接/准备语句/结果集上调用关闭。如果这导致问题,我可以尝试使用资源。 我在日志中观察到以下内容:

2014-09-14 18:53:25,302 WARN c.z.h.p.LeakTask [Hikari Housekeeping Timer (pool testHikariCp)] Connection leak detection triggered, stack trace follows java.lang.Exception
        at com.akkadian.db.DBConnPool.getConnection(DBConnPool.java:67)
        at models.tester.storeload.testAlertLogStoreLoad.loadAll(testAlertChk.java:101)
        at com.testLib.map.MapStoreWrapper.loadAll(MapStoreWrapper.java:131)
        at com.testLib.map.mapstore.AbstractMapDataStore.loadAll(AbstractMapDataStore.java:40)
        at com.testLib.map.BasicRecordStoreLoader$MapLoadAllTask.run(BasicRecordStoreLoader.java:340)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at com.testLib.util.executor.CompletableFutureTask.run(CompletableFutureTask.java:57)
        at com.testLib.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:209)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at com.testLib.util.executor.testLibManagedThread.executeRun(testLibManagedThread.java:76)
        at com.testLib.util.executor.testLibManagedThread.run(testLibManagedThread.java:92)

我增加了连接超时并设置了 leakDetectionthreshold 如下:

     hikariConfig.setConnectionTimeout(90000); 
     hikariConfig.setLeakDetectionThreshold(10000); 

我还增加了池的大小,尽管建议不要这样做 - 我不得不测试各种选项,因为我收到来自数据库的连接超时。

最佳答案

确保您确实将连接释放回池中?您可以尝试使用资源吗(除了像 Brett 提到的那样增加阈值):

try (Connection conn = DBConnectionPool.getConnection(); 
        PreparedStatement ps = conn.prepareStatement(preparedQuery);) {

和结果集(因为某些驱动程序/数据库在清除连接时可能不会清除结果集,但不确定这是否对新驱动程序/数据库仍然有效,但我不确定您使用的是什么):

尝试(结果集 rs = ps.executeQuery();){

如果需要,请增加泄漏检测阈值,但我认为如果您必须将其设置得过大,就会遇到需要修复的问题。

关于java - 来自 hikaricp 连接池的连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25838996/

相关文章:

java - 如何使用用户密码以编程方式打开 PDF

java - Tomcat 和其他容器中的数据源和连接池与 JNDI 有什么关系?

database - 在应用程序和数据库之间创建连接意味着什么?

java - 关闭来自 R2DBC 池的连接

java - java tomcat应用程序的Maven项目配置

java - 为什么 @Validated + @Component + Implement 会在 Spring Boot 中导致类型误导性错误?

java - Stuckup with - HikariCP : JZ0C0: Connection is already closed (Sybase DB with SpringBoot v2. 1.7)

java - HikariCP 与 jooq 的连接太多

java - 将数字组合成一个 Java 变量

java - HikariCP 包装器(线程安全)