6

我在 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 示例永远不会关闭这样获得的实体管理器。我尝试关闭它,但随后应用程序爆炸说实体管理器已关闭。

有任何想法吗?

4

4 回答 4

8

尝试使用 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
于 2013-03-19T13:09:40.043 回答
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 += ...
于 2013-07-15T00:20:26.607 回答
0

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

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

于 2013-03-21T09:18:40.807 回答
-1

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

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

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

于 2013-03-20T04:50:27.413 回答