На самом деле ни Spring, ни JPA не имеют к этому никакого отношения.Внутренне все персистентные фреймворки просто вызывают DataSource.getConnection()
и ожидают получить (вероятно, объединенное) соединение JDBC.Как только они закончили, они close()
установили соединение, эффективно возвращающее его в пул.
Теперь, когда DataSource
запрашивают соединение, но база данных недоступна, он выдаст исключение.Это исключение будет распространяться вверх и будет каким-то образом обрабатываться любой используемой платформой.
Теперь, чтобы ответить на ваш вопрос - обычно DataSource
реализация (например, dbcp , c3p0 и т. д.) удалит соединение, о котором известно, что оно оборвано, и заменит его новым.Это действительно зависит от провайдера, но вы можете смело предположить, что как только база данных снова станет доступной, DataSource
постепенно избавится от больных соединений и заменит их на здоровых соединений.
Также многие DataSource
разработчики предоставляют способы периодически проверять соединение и до того, как оно будет возвращено клиенту.Это важно в объединенных пулах environemnts, где DataSource
содержит пул соединений, и когда база данных становится недоступной, она не может это обнаружить.Таким образом, некоторые DataSource
s тестовые соединения (путем вызова SELECT 1
или аналогичные), прежде чем вернуть его клиенту и делать то же самое время от времени, чтобы избавиться от разорванных соединений, например, из-за разрыва основного соединения TCP.
TL; DR
Да , вы получите исключение и да система будет работать нормально, как только база данных вернется.Кстати, вы можете легко проверить это!