【问题标题】:Heroku/Play/BoneCp connection issuesHeroku/Play/BoneCp 连接问题
【发布时间】:2013-07-15 08:20:26
【问题描述】:

我在 heroku 上有一个使用 play 的应用程序。它在很长一段时间内都运行良好,但最近我开始得到这个:

Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) ~[hibernate-core-4.1.9.Final.jar:4.1.9.Final]
at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:503) ~[bonecp-0.7.1.RELEASE.jar:0.7.1.RELEASE]

这是由

引起的
org.postgresql.util.PSQLException: FATAL: too many connections for role "ejmatdbwywaugk"

现在这很明显是连接泄漏,除了我使用的是 JPA.em()。 Play 示例永远不会关闭这样获得的实体管理器。我尝试关闭它,但应用程序爆炸说实体管理器已关闭。

有什么想法吗?

【问题讨论】:

    标签: java heroku playframework-2.0 entitymanager bonecp


    【解决方案1】:

    尝试使用 BoneCP 0.8.0-rc1 并使用此配置:

    db.default.idleMaxAge=10 minutes
    db.default.idleConnectionTestPeriod=30 seconds
    db.default.connectionTimeout=20 second
    db.default.connectionTestStatement="SELECT 1"
    db.default.maxConnectionAge=30 minutes
    

    【讨论】:

    • 这已经过去两天了,没有出现问题。相信确实是0.7.1版本的BoneCp的问题。为了将来参考,这是您应该在 appDependencies 下的 Build.scala 文件中包含的内容:“com.jolbox”%“bonecp”%“0.8.0-rc1”
    • 我不知道是否是 BoneCP 的问题,但我发现问题是在大约 40 秒的空闲连接后开始的……如果您将 idleConnectionTestPeriod 设置为 40 秒,我认为问题会再次出现。跨度>
    • 谢谢。这似乎对我有用。它应该记录在某个地方。
    【解决方案2】:

    BoneCP/Heroku/Play 处理连接的方式存在缺陷。我在 github 上对 BoneCP 进行了修复:

    https://github.com/wwadge/bonecp/pull/10

    此外,通过将以下内容添加到 Build.scala 可以使用已编译的库:

    val appDependencies = Seq(
    "com.jolbox" % "bonecp" % "0.8.0-rc2-SNAPSHOT-20130712-14382677.jar",
    ....
    
    val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
      libraryDependencies += "com.jolbox" % "bonecp" % "0.8.0-rc2-SNAPSHOT-20130712-14382677.jar" from "https://dl.dropboxusercontent.com/u/36714110/libraries/bonecp-patches/bonecp-0.8.0-rc2-SNAPSHOT-20130712-14382677.jar"
    ,resolvers += ...
    

    【讨论】:

      【解决方案3】:

      BoneCP 0.7.1 版(目前是稳定版本)存在一个已知的连接泄漏问题 - Bug 999114。切换到@MaFo 提到的更高版本应该可以解决它。 BoneCP/Postgres connections leak中也提到了一个解决方法

      最后,我在我正在从事的项目中切换到另一个连接池 Tomcat JDBC Connection Pool,因为我希望它(将)作为 apache 项目的一部分得到更好的支持。

      【讨论】:

        【解决方案4】:

        我在使用远程 postgres 实例时遇到了同样的问题。我在 application.conf 数据库设置中添加了以下内容:

        db.default.partitionCount=1
        db.default.maxConnectionsPerPartition=5
        db.default.minConnectionsPerPartition=5
        

        这对我有用。我正在使用 org.postgresql.Driver 驱动程序。

        【讨论】:

          猜你喜欢
          • 2013-07-31
          • 1970-01-01
          • 1970-01-01
          • 2015-01-29
          • 1970-01-01
          • 1970-01-01
          • 2020-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多