2

其中“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 finalizeReferent

似乎在没有关闭连接的情况下调用了连接的终结器——但这怎么可能呢?try-with-resource 不能保证连接关闭吗?

然后在此之后我开始收到这些错误:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

有没有办法让 boneCP 向我展示一个堆栈跟踪,在这些跟踪中创建了这些最终的未关闭异常?谁能提出问题可能是什么?

4

2 回答 2

1

与预期相反,该错误仍然出现在 v0.8.0-RELEASE 中。鉴于此线程,BoneCP 作者构建了一个0.8.1-SNAPSHOT,但并没有完全解决问题。

似乎许多配置设置可能会有所帮助,特别是设置

db.default.maxConnectionAge=0

此外,有人提出错误可能来自 BoneCP 中的连接跟踪机制disableConnectionTracking=true,如果连接管理是由 Spring 等框架执行的,则建议通过在代码执行中设置来禁用它。

就我而言,我使用的是 Play Framework 2.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.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

这似乎暂时解决了,但我不能保证问题已经完全解决。

希望这可以帮助

于 2014-03-17T13:34:54.243 回答
0

这个错误应该在 v0.8.0-beta1 中修复

于 2012-11-01T09:51:10.730 回答