Устойчивость базы данных - PullRequest
1 голос
/ 29 января 2010

Я разрабатываю приложение, которое в значительной степени опирается на базу данных.Мне нужно, чтобы мое приложение было устойчивым к кратковременным потерям соединения с базой данных (например, сеть отключалась на несколько секунд).Каковы обычные модели, которые люди используют для такого рода проблем.Есть ли что-то, что я могу сделать на уровне доступа к базе данных, чтобы изящно обработать небольшой сбой в сетевом соединении с БД (я использую hibernate + oracle jdbc + dbcp pool).

1 Ответ

2 голосов
/ 29 января 2010

Полагаю, вы скрыли каждый доступ к базе данных за DAO или чем-то подобным.

Теперь создайте оболочки вокруг этих DAO, которые пытаются вызвать их, а в случае исключения подождите секунду и повторите попытку. Конечно, это приведет к «зависанию» приложения во время отключения db, но оно вернется к работе, когда база данных станет доступной.

Если это неприемлемо, вам придется переместить вырезку ближе к слою пользовательского интерфейса. Рассмотрим следующий подход.

Пользователь вызывает запрос.

обернуть всю информацию запроса в сообщение и поместить его в очередь.

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

Рабочий, зарегистрированный в очереди, обработает запрос, повторяя попытку при наличии проблем с базой данных.

Обратите внимание, что вы сейчас глубоко в земле параллелизма. Поэтому вы должны обрабатывать такие вещи, как запросы, ссылающиеся на сущность, которая уже была удалена.

Читайте о «возможной последовательности»

Поскольку вы используете hibernate, вам придется иметь дело с отложенной загрузкой. Прерывание соединения убьет ваш сеанс, поэтому для вас может быть лучше вообще не использовать отложенную загрузку, а работать с отсоединенными объектами.

...