Можно ли восстановить соединения jdbc? - PullRequest
1 голос
/ 14 сентября 2011

Могут ли быть восстановлены соединения jdbc, которые закрыты из-за недоступности базы данных.

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

java.sql.SQLException: ORA-12537: TNS: соединение закрыто

java.sql.SQLRecoverableException: ORA-01034: ORACLE недоступен ORA-27101: область общей памяти не существует IBM AIX RISC System / 6000 Ошибка: 2: Нет такого файла или каталога

java.sql.SQLRecoverableException: ORA-01033: ORACLEвыполняется инициализация или завершение работы

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Нет. Соединение "мертвое". Создать новое соединение.

Хорошим подходом является использование пула соединений , который проверит, все ли в порядке соединение перед тем, как передать его вам, и автоматически создаст новое соединение, если необходимо.

Существует несколько пулов соединений с открытым исходным кодом. Я использовал Apache JDCP , и он работал для меня.

Отредактировано:
Учитывая, что вы хотите подождать, пока база данных не восстановится, если она не работает (интересная идея), вы можете реализовать собственную версию getConnection(), которая «ждет некоторое время и пытается снова», если база данных не отвечает.

p.s. Мне нравится эта идея!

0 голосов
/ 14 сентября 2011

Соединение не может быть восстановлено. Что можно сделать, это переключить соединение с другим экземпляром базы данных. Установки RAC и Data Guard поддерживают эту конфигурацию.

Это не проблема для транзакций только для чтения. Однако для транзакций, которые выполняют DML, это может быть проблемой, особенно если последний вызов БД был коммитом. В случае фиксации клиент не может сказать, завершен ли вызов фиксации или нет. Когда произошла ошибка БД; перед выполнением коммита или после выполнения коммита (но без отправки подтверждения клиенту). Только приложение имеет эту логику и может делать правильные вещи. Если приложение после отработки отказа не проверяет состояние последней транзакции, возможны дублирующие транзакции. Это известная проблема, и большинство из нас испытывали это при покупке билетов или аналогичных веб-транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...