Как Spring-JPA EntityManager обрабатывает «разорванные» соединения? - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть приложение, которое использует Spring-EntityManager (JPA), и мне интересно, что произойдет, если база данных окажется недоступной во время жизни моего вышеупомянутого приложения.

Я ожидаю, что в этой ситуации оно будет выданоисключение в первый раз, чтобы что-то сделать с базой данных, верно?

Но, скажем, я подожду 10 минут и попробую еще раз, и БД вернется.Это восстановится?Могу ли я организовать это так, что он делает?

Спасибо

1 Ответ

7 голосов
/ 28 февраля 2012

На самом деле ни Spring, ни JPA не имеют к этому никакого отношения.Внутренне все персистентные фреймворки просто вызывают DataSource.getConnection() и ожидают получить (вероятно, объединенное) соединение JDBC.Как только они закончили, они close() установили соединение, эффективно возвращающее его в пул.

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

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

Также многие DataSource разработчики предоставляют способы периодически проверять соединение и до того, как оно будет возвращено клиенту.Это важно в объединенных пулах environemnts, где DataSource содержит пул соединений, и когда база данных становится недоступной, она не может это обнаружить.Таким образом, некоторые DataSource s тестовые соединения (путем вызова SELECT 1 или аналогичные), прежде чем вернуть его клиенту и делать то же самое время от времени, чтобы избавиться от разорванных соединений, например, из-за разрыва основного соединения TCP.

TL; DR

Да , вы получите исключение и да система будет работать нормально, как только база данных вернется.Кстати, вы можете легко проверить это!

...