hibernate не восстанавливает соединение, когда база данных восстановлена - PullRequest
7 голосов
/ 09 марта 2011

Я обнаружил, что после того, как мы отскочили (остановили и запустили) нашу базу данных (postgresql 8.3), наши приложения, использующие hibernate (3.2.6), не могут повторно получать соединения, вместо этого получают исключение SocketException с сообщением сломанная труба ".

Я считаю, что мы настроены на использование встроенного пула соединений.

как мне сделать hibernate повторно подключиться после перезапуска БД без перезапуска приложения?

р.

Ответы [ 2 ]

7 голосов
/ 09 марта 2011

Вам нужна функция, называемая проверка соединения , предоставляемая пулами соединений - пул соединений должен выполнить быстрый запрос, чтобы убедиться, что соединение, которое он собирается раздать, не устарело.К сожалению, DriverManagerConnectionProvider , класс пула подключений по умолчанию в Hibernate, не поддерживает эту функцию.Команда Hibernate настоятельно не рекомендует использовать этот пул соединений в производственном коде.

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

Я рекомендую вам переключиться на другую реализацию пула соединений.Если вы переключитесь на C3P0 (который поставляется с Hibernate), тестирование соединения может быть настроено, как описано здесь .Если вы используете Apache DBCP, он позволяет установить запрос проверки, как описано здесь .

2 голосов
/ 09 марта 2011

Если вы используете hibernate в jboss, вы можете настроить его в файле * -ds.xml в каталоге deploy для выполнения некоторого запроса перед установлением соединения из пула соединений: Например:

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

Если вы используете свой собственный пул соединений, вы можете написать что-то вроде этого:

Connection getConnectionFromPool() {
   try {
      //get connection from pool
      //execute some simple uery that should always work
   } catch (SocketException s) {
      //close broken connection and get a new one
   }
   return connection;
}

Или, может быть, есть механизм для этого в спящем режиме, но я не знаю об этом.

РЕДАКТИРОВАТЬ: хорошо, читая ваш вопрос, я пропустил, что вы используете пул соединений Hibernate. Поэтому проигнорируйте мой ответ и посмотрите здесь: Восстановить соединение Hibernate

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