BoneCP сообщает о незакрытых соединениях, но я использую try-with-resource везде, где я получаю новое соединение - PullRequest
2 голосов
/ 23 марта 2012

Где "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 для дополнительной помощи в отладке.23 марта 2012 9:55:17 com.jolbox.bonecp.ConnectionPartition $ 1 finalizeReferent

Кажется, что финализатор соединения вызывается без закрытия соединения - но как это может быть?Разве попытка с ресурсом не гарантирует, что соединение закрывается?

Затем, после этого, я начинаю получать следующие ошибки:

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

Есть ли какой-нибудь способ заставить boneCP показать мнетрассировка стека, где создаются эти завершенные незамкнутые исключения?Кто-нибудь может подсказать, в чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 17 марта 2014

Вопреки ожиданиям, ошибка все еще появляется в v0.8.0-RELEASE. Учитывая этот поток , автор BoneCP создал 0.8.1-SNAPSHOT , но это не полностью решило проблему.

Похоже, что многие настройки конфигурации могут помочь, в частности настройки

db.default.maxConnectionAge=0

Более того, кто-то предположил, что ошибка может происходить из-за механизма отслеживания соединений в BoneCP, и порекомендовал отключить его, установив disableConnectionTracking=true при выполнении кода, если управление соединением осуществлялось с помощью инфраструктуры, такой как Spring.

В моем случае я использую Play Framework 2.1.4 и mySQL (развернут на Heroku с ClearDB). Я написал следующий код в файле 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

Пока что это работает, но я не могу гарантировать, что проблема была полностью решена.

Надеюсь, это поможет

0 голосов
/ 01 ноября 2012

Эта ошибка предположительно исправлена ​​в v0.8.0-beta1

...