当前位置: 首页 > 知识库问答 >
问题:

hikaricp连接池中的连接对象

吴胜涝
2023-03-14

我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,在其中我实例化了一个HikariDataSource(使用HikariConfig对象)。对于这个DBPool,我使用lazyholder习惯用法来限制每个VM一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每次通过数据库池获取连接引用时,我都会调用connection/preparedstatement/resultset上的close。如果引起问题,我可以尝试使用资源。我在日志中观察到以下情况:

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)

我增加了连接超时,并设置了泄漏检测阈值如下:

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

我还增加了池的大小,尽管建议不要-我必须测试各种选项,因为我从数据库中收到连接超时。

共有1个答案

单于帅
2023-03-14

确保你确实释放了连接回到池?您可以使用资源的try(除了增加Brett提到的阈值):

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

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

ps.execute查询

如果需要,增加泄漏检测阈值。尽管我认为如果必须将其设置得过大,则会出现需要修复的问题。

 类似资料:
  • 我有这个使用HikariCP连接池的代码: 我通过发出命令“Show Processlist”来监控mysql中的连接,我看到在行之后创建了100个连接: 。。。正在运行。我肯定这不是命中注定的,对吧?它应该在稍后执行pooledDataSource时创建连接。getConnection()。 我做错了什么?为什么它会立即创建100个连接??

  • 地狱, 我是否可以获取HKARIP连接池度量信息,如总连接数、空闲连接数等? 我知道Hikaripool记录这样的信息: 清理前池统计数据库(总计=20,使用次数=0,可用次数=20,等待次数=0) 但是它太频繁了,我的代码无法控制它。我想在可配置的时间内记录这些信息,例如1分钟。顺便说一句,我用Scala Slick 3.0

  • > 可能是我有这个确切的问题https://github.com/brettwooldridge/hikaricp/issues/109在我的例子中,活动连接随着每个事务的增加而增加。 HikariCP-连接不可用这也是一个相同的问题。但没有人对此提供明确的解决方案。顺便说一句,我使用了begging中的。

  • 我们已将基于Spring Batch的应用程序更新为Spring Batch 4的最新版本。x和Boot 2.0。并且HikariCP MySQL连接池存在一些问题。 如果我使用10个连接的默认maxPoolsize,并且我使用5个线程,每个线程都启动一个简单的虚拟作业,这个工作正常。(使用SimpleJobLauncher)。所有作业立即启动,之后HikariCP池已返回所有使用的连接。 当我做

  • 我正在开发一个查询多个数据库的监控插件。我想使用HikariCP来保持连接打开,但我不知道如何实例化连接池。 HikariCP是否只使用一个池来存储多个数据库?或者一个数据库只有一个池,我的责任是实例化我将使用的数据库中的尽可能多的池。

  • 此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。 当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。 HikariCP人员的最佳实践通常也是,增加连接池不是实现