【问题标题】:Play - HikariCP connections not released back to pool播放 - HikariCP 连接未释放回池
【发布时间】:2014-10-28 20:56:37
【问题描述】:

在一个有两个子项目的 Play 项目中,我们正在尝试 HikariCP,它似乎没有将连接释放回池并抛出此异常:

java.sql.SQLException: Timeout of 30000ms encountered waiting for connection.

这是在六个简单查询后调试显示的内容:

[DEBUG] c.z.h.p.HikariPool - Before cleanup pool stats pool1 (total=5, inUse=5, avail=0, waiting=1)
[DEBUG] c.z.h.p.HikariPool - After cleanup pool stats pool1 (total=5, inUse=5, avail=0, waiting=1)
[DEBUG] c.z.h.p.HikariPool - Timeout failure pool stats pool1 (total=5, inUse=5, avail=0, waiting=0)
[ERROR] application - Error in datastore operation detected.
java.sql.SQLException: Timeout of 30000ms encountered waiting for connection.
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:207) ~[HikariCP-java6-2.0.1.jar:na]
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:93) ~[HikariCP-java6-2.0.1.jar:na]
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
[DEBUG] c.z.h.p.HikariPool - Before cleanup pool stats pool1 (total=5, inUse=4, avail=1, waiting=0)
[DEBUG] c.z.h.p.HikariPool - After cleanup pool stats pool1 (total=5, inUse=4, avail=1, waiting=0)

我们正在使用 两个 具有两个池的 Postgres 数据库,版本是:

Play: 2.3.3
Scala: 2.11.1
HikariCP: 2.0.1
Play-hikaricp: 1.4.1
Postgres: 9.3

更新:

启用泄漏检测 (leakDetectionThreshold=10000) 会生成以下警告:

[WARN] c.z.h.p.LeakTask - Connection leak detection triggered, stack trace follows
java.lang.Exception: null
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:389) ~[slick_2.11-2.1.0.jar:0.8.0]
[WARN] c.z.h.p.LeakTask - Connection leak detection triggered, stack trace follows
java.lang.Exception: null
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152) ~[slick_2.11-2.1.0.jar:0.8.0]
    at scala.slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:389) ~[slick_2.11-2.1.0.jar:0.8.0]

【问题讨论】:

  • 这可能是一个 Slick 配置问题,可能是由于在获得连接后延迟执行查询。我建议启用泄漏检测以查看是否有线程挂在连接上,而不是及时(> 10 秒)将它们返回到池中。
  • @brettw:谢谢。我更新了问题。这到底是什么意思?我注意到其他一些拥有两个数据库/池的用户也遇到了类似的问题。

标签: playframework playframework-2.0 slick hikaricp


【解决方案1】:

正如我在 github 上的 bug report 中所说,这似乎是 answered here。我不是 Play/slick 开发人员,所以我不知道根本问题是什么。但我知道这不是 HikariCP 中的错误。关闭的连接会立即返回到池中。

像 Scala 这样的异步系统,如果在访问可能阻塞的资源时没有正确使用,可能会产生大量待处理的执行任务,这些任务开始受到资源超时的影响。这通常由用于阻塞访问的单独线程执行池调解。我希望这种东西能够连接到 Slick 框架中,但正如我上面所说的,我对 Slick 并不是很熟悉。

【讨论】:

  • 手动关闭会话解决了这个问题。我希望 Slickians 将为此提供一种更简单的方法。感谢您的出色工作。
  • @centr 只是想知道这是否是一个可持续的解决方案。从长远来看,这对您有用吗?
猜你喜欢
  • 2019-12-03
  • 2014-08-06
  • 2020-03-15
  • 2016-05-31
  • 2013-05-01
  • 2016-10-24
  • 2012-04-22
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多