Java BoneCP正在报告未关闭的连接,但I';我在任何地方都使用try with resource我得到了一个新的连接
其中“ds”是按如下方式初始化的BoneCPDataSource:Java BoneCP正在报告未关闭的连接,但I';我在任何地方都使用try with resource我得到了一个新的连接,java,mysql,bonecp,Java,Mysql,Bonecp,其中“ds”是按如下方式初始化的BoneCPDataSource: final BoneCPDataSource ds = new BoneCPDataSource(); ds.setJdbcUrl("..."); ds.setUser("..."); ds.setPassword("..."); ds.setCloseConnectionWatch(true); ds.setCloseConnectionWatchTimeout(1, TimeU
final BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl("...");
ds.setUser("...");
ds.setPassword("...");
ds.setCloseConnectionWatch(true);
ds.setCloseConnectionWatchTimeout(1, TimeUnit.MINUTES);
以下是我在整个代码中如何使用它:
try (Connection c = ds.getConnection()) {
// do stuff with c, this takes 10 seconds at most
c.commit();
} catch (final Exception e) {
logger.error("Report error", e);
}
但我看到了这些:
警告:BoneCP检测到未关闭的连接,现在将尝试为您关闭该连接。您应该在应用程序中关闭此连接-启用connectionWatch以获得其他调试帮助。
2012年3月23日上午9:55:17 com.jolbox.bonecp.ConnectionPartition$1 finalizerereferent
似乎在连接未关闭的情况下调用了连接的终结器,但这怎么可能呢?try-with资源不保证连接被关闭吗
然后在此之后,我开始出现以下错误:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
有没有办法让boneCP向我展示一个stacktrace,其中创建了这些最终确定的未关闭异常?有人能告诉我问题出在哪里吗?这个bug应该在v0.8.0-beta1中修复了与预期相反,这个bug仍然出现在v0.8.0-RELEASE中。有鉴于此,BoneCP作者构建了一个解决方案,但并没有完全解决问题 看起来很多配置设置可能会有所帮助,特别是设置
db.default.maxConnectionAge=0
此外,有人建议错误可能来自BoneCP中的连接跟踪机制,如果连接管理是由Spring之类的框架执行的,建议通过在代码执行中设置disableConnectionTracking=true
来禁用它
在我的例子中,我使用PlayFramework2.1.4和mySQL(使用ClearDB部署在Heroku上)。我在Global.scala
文件中编写了以下代码:
override def onStart(app: Application) {
play.api.db.DB.getDataSource() match {
case ds: com.jolbox.bonecp.BoneCPDataSource => {
ds.setDisableConnectionTracking(true)
}
}
}
除此之外,我还使用以下DB配置设置:
db.default.partitionCount=1
db.default.maxConnectionsPerPartition=7
db.default.minConnectionsPerPartition=7
db.default.acquireIncrement=1
db.default.acquireRetryAttempts=1
db.default.acquireRetryDelay=5 seconds
db.default.connectionTimeout=30 seconds
db.default.idleMaxAge=1 minutes
db.default.idleConnectionTestPeriod=30 seconds
db.default.connectionTestStatement="SELECT 1"
db.default.maxConnectionAge=0
db.default.autoReconnect=true
db.default.disableConnectionTracking=true
目前看来这是可行的,但我不能保证问题已经完全解决
希望这有帮助