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

HikariCP连接池-“活动”-如何调试?

魏君博
2023-03-14

此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。

当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-(total=10,active=10,idle=0,waiting=2)上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。

HikariCP人员的最佳实践通常也是,增加连接池不是实现伸缩的正确第一步。

如果我确实将连接池的大小增加到20,那么对于10个同时/并发的用户来说,情况就开始正常了,但我认为这并不是问题的根本原因/解决方案。

是否有任何方法可以记录Hibernate或Postgres消息,以帮助了解这些“活动”连接正在等待什么,以及为什么即使在我将等待时间增加到很长时间后连接仍未释放?

如果是连接泄漏(当泄漏检测阈值降低到较低值(例如30秒)时会报告),那么如何判断是Hibernate造成了连接泄漏,还是其他原因造成的?

在@Brettw的帮助之后更新,当连接耗尽并指向连接泄漏的方向时,我进行了线程转储。HikariCP问题板上的线程--https://github.com/brettwooldridge/HikariCP/issues/1030#issuecomment-347632771-,它指向Hibernate没有关闭连接,然后将我指向https://jira.spring.io/browse/spr-14548,它讨论了设置Hibernate的连接关闭模式,因为默认模式保持连接的时间太长。在设置spring.jpa.properties.hibernate.connection.handling_mode=delayed_acception_and_release_after_transaction之后,连接池工作得很好。

此外,这里提出的观点--https://github.com/brettwooldridge/hikaricp/issues/612#issuecomment-209839908是正确的--连接泄漏不应该被池掩盖。

共有1个答案

吴浩博
2023-03-14

这听起来像是在数据库中遇到了真正的死锁。应该有一种方法来查询PostgreSQL当前活动查询和当前锁状态。你得谷歌一下。

另外,我会尝试一个简单的线程转储来查看所有线程被阻塞的位置。可能是代码级同步死锁。

  • 如果getconnection()上的所有线程都被阻塞,这就是泄漏。
  • 根据每个线程的stacktrace,如果驱动程序中的所有线程都关闭,则为数据库死锁。
  • 如果在应用程序代码中等待锁的所有线程都被阻塞,那么就会出现同步死锁--在代码的不同部分可能会出现两个获取顺序相反的锁。
 类似资料:
  • > 可能是我有这个确切的问题https://github.com/brettwooldridge/hikaricp/issues/109在我的例子中,活动连接随着每个事务的增加而增加。 HikariCP-连接不可用这也是一个相同的问题。但没有人对此提供明确的解决方案。顺便说一句,我使用了begging中的。

  • 我正在使用HikariDataSource连接到MariaDB数据库。以下类返回一个。 这是执行select查询的方法。该类还包含一个close方法 try with块自动关闭对象,但如何关闭连接池?例如,我应该在数据库操作之后调用close方法吗 当我不调用方法时,我看不到任何关于关机启动的控制台输出。这是关闭和连接池的正确方法吗?

  • 我们有一个spring-boot应用程序,它使用嵌入式tomcat进行部署,并使用MySQL后端的默认tomcat-jdbc连接池,而没有为MySQL或tomcat端定制。 该应用程序有一些调度程序,它们主要在一天中的特定时间运行,即在昨天的最后一次cron运行和今天的第一次cron运行之间,有超过9个小时的间隙。然而,无论何时cron在早期运行,它都从未遇到过空闲连接问题。 现在我们看到一条错误

  • 我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,在其中我实例化了一个HikariDataSource(使用HikariConfig对象)。对于这个DBPool,我使用lazyholder习惯用法来限制每个VM一个池实例。但是,一旦获得对池的引用,就可以检索连接对象(无需任何进一步的锁/同步/信号量检查),因为我认为连接池会处理我的连接对象限制。每次通过数据

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

  • 我正在使用DBCP连接池,并创建了一个MBean来在Jconsole中显示连接池的统计信息。我观察到的是,即使应用程序上没有活动(意味着没有页面点击等),连接池统计数据也会显示活动连接。 我们在上面看到的16个虚拟连接并没有降到零。我不知道为什么?有人能解释一下吗? 谢谢