Play Framework 2.0.4和BoneCP - 那么如何避免连接泄露?

时间:2012-12-08 15:40:13

标签: playframework playframework-2.0 bonecp connection-leaks

我的应用中只有一个位置使用连接 它看起来像这样:

Connection conn = Db.getConnection();
try
{
    // do some job
}
finally
{
    conn.close();
}

因此,连接总是关闭的 但过了一段时间我总是得到比在bonecp config中定义的更多的连接 ...

问题:
这个问题有明确的解决方案吗?
可能是我应该尝试玩框架2.1?

我真的无法了解一些人如何使用该框架而没有问题...

配置:

db.default.autocommit=true
db.default.isolation=READ_COMMITTED

db.default.partitionCount=3
db.default.minConnectionsPerPartition=6
db.default.maxConnectionsPerPartition=12
db.default.acquireIncrement=1

db.default.acquireRetryAttempts=5
db.default.acquireRetryDelay=50 milliseconds

db.default.connectionTimeout=50 milliseconds
db.default.idleMaxAge=3 minutes

db.default.idleConnectionTestPeriod=0
db.default.initSQL="SELECT 1"

db.default.logStatements=true
db.default.maxConnectionAge=10 minutes

db.default.releaseHelperThreads=0

谢谢!

4 个答案:

答案 0 :(得分:1)

另请查看poolThreshold参数。默认情况下,它设置为所有连接的20%(版本< 0.8,我从0.8及以上版本默认为零,因为它让很多人感到惊讶)。

华莱士

答案 1 :(得分:0)

我的理解是conn.close()并没有真正关闭连接。相反,它会将连接释放回连接池。连接池总是尝试将minConnections(在您的情况下为每个分区6个)连接到数据库。

这可能是“总是获得更多连接”的原因,但这是它应该有效的方式。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在亚马逊上部署我的网站后,我一直面临同样的问题。

试用解决方案1 ​​

使用

Connection conn = Db.withConnection(); //instead of DB.getConnection()

如果这不起作用,请使用最新的BoneCp版本并将其添加到您的SBT中。 (显然,BoneCP处理Connection的方式存在问题。)

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 += ...

请参阅提及此问题的 boneCP GitHub页面。

如果这有助于你,请告诉我。