Как сделать веб-приложение J2EE устойчивым к проблемам с базой данных

У меня есть веб-приложение, работающее на Oracle Weblogic Server 11g. Он использует источник данных, определенный на сервере приложений, для подключения к базе данных Oracle (также 11g), его класс

oracle.jdbc.xa.client.OracleXADataSource

  • Если по какой-то причине база данных отсутствует, а затем возвращается, приложение работает нормально (оно получает исключения при попытке доступа к базе данных, но это нормально, а затем может снова получить некоторые новые соединения, когда база данных возвращается)

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

Есть ли способ развернуть источник данных, даже если база данных отсутствует во время запуска сервера? (чтобы приложение можно было использовать, когда база данных вернулась)


person Denis R.    schedule 04.06.2012    source источник
comment
Одной из альтернатив может быть развертывание источника данных после запуска сервера либо через JMX, либо через классы запуска WebLogic (см.: docs.oracle.com/cd/E15051_01/wls/docs103/jdbc_admin/config.html). Это вариант? Однако я согласен с ответом @Funtik. В общем, ваш сервер базы данных в большинстве случаев должен быть не менее надежным, чем ваш сервер приложений.   -  person Viccari    schedule 05.06.2012
comment
Во-первых, я полностью согласен с тем, что: 1. Сервер базы данных должен быть таким же надежным, как и сервер приложений. 2. имеет смысл иметь приложение, которому требуется база данных для работы без нее.   -  person Denis R.    schedule 05.06.2012
comment
Тем не менее, я не вижу веских логических причин, по которым порядок запуска серверов должен быть важен: в моем случае обе машины работают в виртуализированной инфраструктуре, и когда на ней есть этап обслуживания или инцидент, когда машины перезапускают некоторые человеческие вмешательство на серверах необходимо и я считаю его бесполезным. Если источник данных находится здесь, приложение может выполнить своего рода предварительный запуск и действительно инициализировать себя, когда оно сможет получить соединение с базой данных. Вам не кажется, что это имеет смысл?   -  person Denis R.    schedule 05.06.2012
comment
@ДенисР. Извините, если я был не ясен. То, что вы сказали, имеет большой смысл. Я имел в виду не изменение порядка запуска обоих ваших серверов, а запуск вашего сервера WebLogic без развертывания вашего источника данных, развертывание его позже, когда вы уверены, что ваша БД находится в работоспособном состоянии. Вы можете сделать это с помощью JMX или даже с помощью кода Java. Я не уверен, однако, если это будет соответствовать вашим потребностям.   -  person Viccari    schedule 05.06.2012


Ответы (3)


Почему вы хотите развернуть приложение без действительного источника данных?

Возможно, вы могли бы подделать источник данных (создать фиктивный источник данных с тем же именем JNDI) и предположить, что приложение не проверяет схему источника данных при запуске, вы получите полуфункциональное работающее приложение (которое завершится ошибкой при первом взаимодействии с БД).

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

Обновление:

Согласно спецификации J2EE (версия 1.5) ресурсы привязываются в процессе развертывания. Я считаю, что можно реализовать собственную фабрику, которая будет возвращать фиктивный/активный источник данных. Стоит ли прилагать усилия для реализации? ;)

EE.5.6.2 Обязанности заказчика

Свяжите ссылку на фабрику соединений диспетчера ресурсов с фабрикой соединений диспетчера ресурсов, которая существует в рабочей среде. Например, Deployer может использовать механизм JNDI LinkRef для создания символической ссылки на фактическое имя JNDI фабрики соединений менеджера ресурсов. Тип фабрики соединений диспетчера ресурсов должен быть совместим с типом, объявленным в элементе res-type.

person WeMakeSoftware    schedule 04.06.2012

Вариант, который вы ищете, это «Повторные попытки создания соединения», проверьте это ссылка

«Если установлено, и если база данных недоступна при создании источника данных, WebLogic Server снова попытается создать соединения в пуле через указанное вами количество секунд и продолжит попытки создать соединения, пока не добьется успеха. Этот параметр применяется. к соединениям, созданным при создании источника данных при запуске сервера..."

person souser    schedule 08.06.2012
comment
Это действительно похоже на то, что я ищу. буду тестировать и держать вас в курсе - person Denis R.; 15.06.2012
comment
Привет, @DenisR., ты увидел ожидаемое поведение с этой настройкой? Мне любопытно узнать, могут ли источники данных/приложения развертываться и запускаться с отключенной базой данных, если это установлено. - person David Hergert; 21.08.2013

установите «Начальную емкость» http://docs.oracle.com/cd/E14571_01/web.1111/e13814/jdbc_tuning.htm#i1028616 на 0: weblogic при запуске не будет пытаться создать какое-либо соединение и не завершится ошибкой, если БД недоступна.

person Pierluigi Vernetto    schedule 04.11.2014