Для чего нужен JDBC Connection.isClosed (), и почему Snaq DBPool плохо работает при закрытии? - PullRequest
2 голосов
/ 30 апреля 2010

У меня есть следующий код в Java:

if(!conn.isClosed())
{
    conn.close();
}

Вместо работы я награждаюсь:

java.sql.SQLException: соединение уже закрыто

Мой объект подключения - Snaq.db.CacheConnection

Я проверил JavaDocs для isClosed, и они утверждают, что:

Этот метод обычно не может быть вызван определить, есть ли связь с База данных действительна или недействительна. Типичный клиент может определить, что соединение недействительно при перехвате любого исключения, которые могут быть выброшены при операция предпринята.

Итак, мои вопросы:

1) Что хорошего в том, что JDBC isClosed ()? С каких это пор мы используем исключения в Java для проверки действительности?

2) Какой правильный шаблон для закрытия базы данных? Должен ли я просто закрыть и проглотить исключения?

3) Есть идеи, почему SnaqDB закрывает соединение? (Мой бэкэнд это Postgres 8.3)

1 Ответ

3 голосов
/ 03 мая 2010

Я отвечу на ваши вопросы соответствующими номерами:

  1. Я согласен с вами, кажется странным, что isClosed обеспечивает закрытое состояние только на основе максимальных усилий, и что ваш код все еще должен быть готов к перехвату исключения при закрытии соединения. Я думаю, причина в том, что соединение может быть закрыто базой данных в любое время, и поэтому любой статус, возвращаемый методом состояния запроса, таким как isClosed, является изначально устаревшей информацией - состояние может измениться между проверкой isClosed и вызовом close на Connection.
  2. Вызов close не влияет на ваши данные и на предыдущие запросы. Операции JDBC выполняются с синхронными результатами, поэтому все полезное выполнение либо завершилось успешно, либо завершилось неудачно к моменту вызова isClosed. (Верно как с autoCommit, так и с явными границами транзакций.) Если ваше приложение является единственным пользователем, обращающимся к локальной базе данных, то, возможно, отображение ошибки пользователю может помочь им диагностировать проблемы. В других средах регистрация исключения и его проглатывание, вероятно, являются наилучшим вариантом действий. В любом случае проглатывание исключения безопасно, поскольку не влияет на состояние базы данных.
  3. Глядя на источник для SnaqDB CacheConnection , метод isClosed делегирует базовое соединение. Таким образом, проблема не в этом, а в том, что определенный контракт для isClosed() и Connection.close() вызывает исключение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...