Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BoneCP正在报告未关闭的连接,但I';我在任何地方都使用try with resource我得到了一个新的连接_Java_Mysql_Bonecp - Fatal编程技术网

Java BoneCP正在报告未关闭的连接,但I';我在任何地方都使用try with resource我得到了一个新的连接

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

其中“ds”是按如下方式初始化的BoneCPDataSource:

    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
目前看来这是可行的,但我不能保证问题已经完全解决

希望这有帮助