Как обрабатывать сбои базы данных (Glassfish/MySQL)?
У меня есть трехуровневое приложение со Glassfish 3.1.2.2, база данных MySQL и клиентское приложение Swing. Возможно ли как-то справиться с падением сервера базы данных?
Я пытался остановить службу MySQL во время работы моего приложения. Затем я получаю исключения javax.ejb.EJBAccessException каждый раз, когда пытаюсь получить доступ к базе данных через один из моих сессионных компонентов фасада.
Я хочу уведомить пользователя, что база данных в настоящее время не работает. Более того, я хочу установить свое приложение в "спящий режим", пока база данных не будет запущена и снова запущена.
Каков будет хороший (и, возможно, простой) подход к такому сценарию?
Заранее спасибо за помощь!
2 ответа
A) Убедитесь, что вы настроили Glassfish Connection Pool для автоматического восстановления / переподключения
В конфигурации пула соединений Glassfish JDBC установите значения для:
- Атрибуты:
is-connection-validation-required, validate-atmost-once-period-in-seconds, connection-creation-retry-attempts, connection-validation-method, connection-creation-retry-interval-in-seconds, ping
Конфигурация Glassfish Свойства jdbc-connection-pool
Glassfish Admin - подкоманда create-jdbc-connection-pool
шаги:
- Предполагая, что Glassfish запущен (например, запустите сервер на вкладке "Службы Netbeans", откройте "Серверы" и щелкните правой кнопкой мыши "Glassfish"), тогда у вас должен быть запущен сервер администратора домена.
- Откройте консоль администратора в веб-браузере:
http://localhost:4848
(или используйте любой порт, который вы указали при установке. - Слева в меню "Общие задачи" откройте "Ресурсы" -> "JDBC" и нажмите "Пулы соединений JDBC".
- Нажмите на имя пула подключений (или создайте новое, нажав кнопку "Создать").
- Выберите вкладку "Дополнительно" и введите:
- Подтвердить максимум один раз: (например, 60) в секундах
- Попытки повторного создания: (например, 3)
- Интервал повтора: (например, 10) в секундах
- Проверка соединения: (галочка) Требуется
- Метод проверки: (например, автоматическая фиксация)
- Другие дополнительные свойства по желанию
- Выберите вкладку "Общие" и введите:
- Пинг (Тик)
- Другие общие свойства по желанию
B) Реализовать обработку ошибок приложения / мониторинг БД и оповещения
Обязательно: отлавливайте фатальные ошибки пользователей на уровне инфраструктуры и предупреждайте персонал службы поддержки.
Создайте простой класс JMX для отправки уведомления и вызовите его метод при возникновении фатальной ошибки. JMX MBean Class отправляет уведомления. Вы можете использовать консоль монитора JMX для наблюдения за состоянием серверов - некоторые из этих консолей отправляют оповещения по электронной почте (например, JManage и RHQ), и существуют мосты для доступа через HTTP/AJax или другие языки (например, Jolokia может использовать javascript/perl/java API для доступа к уведомлениям JMX).
Используйте API Календаря Google, чтобы отправить сообщение об ошибке для поддержки календаря Google сотрудников (через 1 или 2 минуты в будущем). Затем настройте календарь Google на отправку уведомлений по электронной почте / SMS-сообщениям - вы получите предупреждение об ошибке прямо в службу поддержки практически в реальном времени. На это распространяются ограничения на использование Google (вежливое ограничение в 10000 запросов в день, поэтому убедитесь, что в ваших приложениях нет ошибок, и используйте логику, чтобы ограничить количество сообщений, отправляемых за час / день / неделю)
Желательно: следить за БД (и, возможно, сервером приложений) и оповещать персонал службы поддержки о сбоях
- Zabbix с открытым исходным кодом имеет встроенный мониторинг и оповещение MySQL - он легкий, но требует настройки и настройки
- Hyperic с открытым исходным кодом имеет плагины расширения для мониторинга MySQL и встроенных предупреждений - имеет большой вес, может быть сложным в настройке и настройке
- Nagois с открытым исходным кодом используется по умолчанию для *nix ОС - имеет большой вес, может быть сложным в настройке и настройке
В любом случае, установка не будет происходить мгновенно - лучше всего реализовать как отдельный мини-проект и сделать это правильно - лучше всего привлечь к этому вспомогательный персонал.
Если это "выходит за рамки", то создайте свой собственный простой монитор:
- Таймер EJB для запуска запланированного простого тестового запроса к вашей БД - в случае сбоя отправьте оповещение (через JMX/Google Calendar/Java Mail/ SMS gateway API). Или используйте Quartz планировщик с открытым исходным кодом, чтобы сделать ту же работу
Сам по себе Connection Pool будет следить за состоянием базы данных. Вы можете создать перехватчик и поднять, когда дБ падает. Контейнер попытается восстановить соединение, но вы не обязательно будете знать, когда он будет успешным. Как только вы обнаружите ошибку, вам нужно где-то установить семафор. Затем вам нужно будет запустить таймер, чтобы периодически проверять состояние БД и сбрасывать семафор после его возвращения. Наконец, вы должны написать свое приложение, чтобы уважать семафор.
Это предложение высокого уровня. удачи.
Кроме того, вы можете перехватить все события, используя JMX... Я не уверен, хотя.