2012-02-28 4 views
2

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

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

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

Благодаря

ответ

7

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

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

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

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

TL; DR

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

+0

Спасибо, это было именно то, что я искал. – kkiefer

Смежные вопросы