【问题标题】:Intermittent connection failures with heroku postgres while using play-slick使用 play-slick 时 Heroku postgres 的间歇性连接失败
【发布时间】:2018-09-05 01:00:21
【问题描述】:

我在 heroku 上有一个使用 play-slick 连接到 postgres 实例的播放应用程序。大约 30% 的情况下,当我部署一个新应用程序时,我会在日志中看到:

java.sql.SQLTransientConnectionException: db - Connection is not available, request timed out after 1007ms. 

当我重新启动应用程序时,它通常会重新启动,但有时需要尝试几次。

对于我可以做些什么来调试这个有什么建议吗?

【问题讨论】:

  • Connection is not available, 您的连接是如何终止的?对我来说听起来很断断续续。
  • 它不会在运行过程中终止,它只是永远不会连接到新的部署。
  • 可能有点晚了,但您的启动日志中是否有较早的错误提示 Default transaction isolation level detection failed. (This ResultSet is closed.)?我发现我收到了Connection is not available 错误,但堆栈跟踪更往下是Caused by: java.sql.SQLException: Unsupported transaction isolation level '-1',所以我在application.conf 中手动设置它(slick.dbs.default.db.isolation = "SERIALIZABLE"),它现在可以工作了。

标签: postgresql scala heroku playframework slick


【解决方案1】:

很可能有一段时间,旧应用程序和新应用程序都在尝试获取与数据库的连接,这意味着您有 最大允许连接数处于活动状态。

有两种解决方案:

  • 升级您的数据库计划以允许更多连接
  • 将最大数据库连接数减少一半

play-slick uses HikariCP 用于池连接,因此您可以使用maximumPoolSize 配置最大连接数。

【讨论】:

  • 这是我的第一个想法,但我的最大连接大小是 120 个连接,我从来没有看到自己超过 ~45
  • 每个数据库有两到三个 dyno 连接到它,一个使用 3-4 个连接,另外一两个使用 ~20 个。
【解决方案2】:

我相信我已经弄清楚了问题所在。我使用了默认的 heroku play Procfile,其中包含 -Ddb.default.url=${DATABASE_URL} 并且还在我的 conf 中指定了 slick db url。删除前者解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2021-05-25
    • 2019-07-08
    • 2016-10-14
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多