Полагаю, вы скрыли каждый доступ к базе данных за DAO или чем-то подобным.
Теперь создайте оболочки вокруг этих DAO, которые пытаются вызвать их, а в случае исключения подождите секунду и повторите попытку. Конечно, это приведет к «зависанию» приложения во время отключения db, но оно вернется к работе, когда база данных станет доступной.
Если это неприемлемо, вам придется переместить вырезку ближе к слою пользовательского интерфейса. Рассмотрим следующий подход.
Пользователь вызывает
запрос.
обернуть всю информацию запроса в сообщение и поместить его в очередь.
вернитесь к пользователю, сообщив ему, что его запрос будет обработан в ближайшее время.
Рабочий, зарегистрированный в очереди, обработает запрос, повторяя попытку при наличии проблем с базой данных.
Обратите внимание, что вы сейчас глубоко в земле параллелизма. Поэтому вы должны обрабатывать такие вещи, как запросы, ссылающиеся на сущность, которая уже была удалена.
Читайте о «возможной последовательности»
Поскольку вы используете hibernate, вам придется иметь дело с отложенной загрузкой. Прерывание соединения убьет ваш сеанс, поэтому для вас может быть лучше вообще не использовать отложенную загрузку, а работать с отсоединенными объектами.