Является ли Statement.close () явно требуется в среде пула соединений? - PullRequest
4 голосов
/ 03 июня 2009

Я использую пул соединений в своем приложении. Мой вопрос:

Требуется ли явно закрывать оператор перед закрытием соединения в случае среды пула соединений?

При подключении к соединенной среде соединение не закрывается (но возвращается обратно в пул свободных соединений). Я проверил функциональные характеристики JDBC 4.0. В пункте 9.4.4 четко указано, что:

Закрытие объектов соединения. Приложение вызывает метод Connection.close, чтобы указать, что оно завершило использование соединения. Все объекты Statement, созданные из данного объекта Connection, будут закрыты при вызове метода close для объекта. Когда соединение закрыто, любая попытка доступа к любому из его методов, за исключением методов close, isClosed или isValid, приведет к возникновению исключения SQLException.

Таким образом, спецификации jdbc требуют закрытия всех операторов во время закрытия соединения. Так применимо ли это только к среде без пула соединений или же это относится и к среде пула соединений?

По моему мнению, это не должно иметь значения в случае пула, потому что мы кодируем интерфейс (java.sql.Connection & java.sql.Statement). Таким образом, мы не беспокоимся о реализации, и у родительского класса (java.sql.Connection) нет никакой информации о дочернем / классе имплементации (классе реализации поставщика).

Ответы [ 3 ]

7 голосов
/ 03 июня 2009

Абсолютно. Возможно, что реализация Statement будет иметь другие ресурсы, которые должны быть освобождены, или иметь другие отношения с соединением. Вы не знаете и не должны знать детали реализации.

Ваш подход абсолютно верен: используйте код для интерфейса и избегайте небольших «ярлыков», которые могут легко укусить вас позже. (Даже если это работает сейчас, это может не произойти в будущей версии пула или классов соединений.)

4 голосов
/ 04 июня 2009

Любой объект, который имеет close (), release (), destroy () и т. Д., Автоматически предлагает (конечно, вы должны прочитать документацию API, для этой цели могут использоваться разные имена), что объекту нужно вызвать этот метод, чтобы гарантировать, что ресурсы объекта высвобождаются, когда объект больше не используется. Не будет никакой причины предоставлять такой метод, если объект может сделать это сам.

В случае пула java.sql.Connection соединение на самом деле не закрыто, просто передается обратно в пул как доступное соединение, но это внутренняя структура иначе вам все равно .

2 голосов
/ 04 июня 2009

По моему опыту, некоторые драйверы JDBC имеют ошибки. Похоже, они работают лучше, если вы закроете все операторы (и ResultSets) вручную. В противном случае я видел утечки ресурсов, которые не должны были сохраняться после закрытия соединения.

...