BoneCP (или любой другой пул) закрывает операторы соединения, когда соединение возвращается в пул? - PullRequest
4 голосов
/ 03 декабря 2010

Закрывает ли BoneCP (или любой другой пул) операторы соединения, когда соединение возвращается в пул?Как я понимаю, он не вызывает фактического метода закрытия соединения, поэтому автоматического закрытия операторов не происходит.Так, это закрывает операторы любым другим способом или мне нужно закрыть их вручную?

Ответы [ 2 ]

5 голосов
/ 04 декабря 2010

В спецификации JDBC совершенно неясно, что должно происходить при обычном закрытии соединения, поэтому независимо от используемого пула вы должны всегда обязательно закрывать операторы вручную. Подумайте, что произойдет с вашим приложением, если в будущем вы решите переключиться на другой пул, который не будет делать то, что вы ожидаете, что он сделает для вас.

Что касается BoneCP, ответ - нет, он не закроет ваши заявления за вас, хотя он может быть настроен на закрытие ваших соединений, если вы забудете. Это из соображений производительности, поскольку некоторые драйверы JDBC закрывают все еще активные операторы внутри, если вы закрываете соединение.

Однако BoneCP закроет все кэшированные операторы, если у вас включено кэширование операторов.

РЕДАКТИРОВАТЬ: Начиная с v0.8.0, была добавлена ​​поддержка для закрытия незакрытых операторов (+ распечатывать трассировку стека места, где оператор был открыт, если хотите).

1 голос
/ 22 сентября 2013

BoneCP (0.8.0 -RC3), есть 2 возможных результата,

закрывается с некоторой конфигурацией только для некэшированного оператора

не закрывать независимо от того, как вы настроили его для кэшированного оператора , даже если вы вызываете оператор Statement.close () явно.

Существует класс StatementCache для кэширования prepareStatement & callableStatement.По умолчанию отключено.Вам необходимо вызвать BoneCPConfig.setStatementsCacheSize () с параметром> 0, чтобы включить его.После включения кэша

1 BoneCP.Statement.Close () будет обходить базовый оператор close, если он кэшируется.

  public void close() throws SQLException {
      this.connectionHandle.untrackStatement(this);
  this.logicallyClosed.set(true);
  if (this.logStatementsEnabled){
        this.logParams.clear();
        this.batchSQL = new StringBuilder();
      }

      if (this.cache == null || !this.inCache){ // no cache = throw it away right now
           this.internalStatement.close();
  }
}

2 BoneCP.Connection.close () Просто очистит кэш с помощью функции "clearStatementCaches ()"

Хорошая новость - драйвер JDBC MYSQL, Connector / J, будетзакрыть все открытые операторы, когда вы закрываете соединение с помощью функции «closeAllOpenStatements ()»

...