2013-08-26 2 views
2

У меня есть приложение EJB, которое использует JPA 2.0 на Glassfish 3.1.2 (провайдер EclipseLink). Когда база данных не работает, приложение не запускается и даже больше: не может быть развернуто. Это связано с тем, что EclipseLink выполняет некоторую начальную проверку.Glassfish: тихо игнорировать недоступный источник данных при запуске приложения

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

Фон: недоступный ресурс не вступает в игру до тех пор, пока не будет вызвана первая бизнес-функция, которая обращается к базе данных. От запуска приложения до первого вызова бизнес-функции есть окно времени, в котором может быть запущена база данных.

Изменение значения по умолчанию в glassfish-resources.xml для атрибутов connection-creation-retry-attempts и connection-creation-retry-interval-in-seconds из <jdbc-connection-pool> помогает в некотором роде, но это все-таки проверить базу данных Availabilty при запуске не первое использовании.

ExceptionHandler от EclipseLink не так, как я имею в виду: когда обработчик исключений входит в игру EclipseLink уже начал процесс проверки и, следовательно, попытался подключиться к базе данных. То, что я ищу, - это отложить процесс проверки до первого бизнес-вызова.

ответ

1

EclipseLink проверка базы данных выполнен в первом использовании. Однако это первое использование, скорее всего, представляет собой точку впрыска @PersistanceUnit, которая обрабатывается контейнером. @PersistanceUnit инъекция обрабатывается во время развертывания, и вы ничего не можете сделать, чтобы поймать это. Если вы не хотите, чтобы EclipseLink проверял время развертывания, вам необходимо обработать свой собственный EntityManagerFactory.

Я бы рекомендовал создать прослушиватель контекста приложения, он может хранить копию вашего EntityManagerFactory и выполнять срыв при распаковке/перераспределении. Во время обычного запуска вы можете просто ничего не устанавливать до тех пор, пока это не понадобится. Вот базовая модель, которую я бы следовал: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

+0

Если я использую свой собственный EntityManagerFactory без инъекции, я должен управлять транзакциями на себя, я полагаю. Это правильно? – Claude

+0

@ Майкл, Да, это правильно. – nickrak

+0

Есть ли лучший способ, например, конфигурация в файле persistence.xml или развертывании с помощью glassfish 4? Иногда наша база данных не работает во время развертывания, но я бы хотел избежать ручного управления транзакциями. – bdrx

-1

Возможно, вы можете использовать EclipseLink ExceptionHandler, чтобы поймать ошибку.

+0

Да, конечно, но в зависимости от продукта базы данных требуется специальная обработка брошенных исключений. Тем не менее, я задаюсь вопросом, есть ли свойство стеклянной рыбы или eclipselink, которое можно установить. Предположим, что база данных доступна, когда приложение запускается. Если база данных становится недоступной позже, это не проблема для приложения, пока не будет вызван следующий бизнес-метод. Таким образом, поведение приложения зависит от порядка событий. – Claude

+0

В дополнение к первому комментарию, что должно быть сделано в ExceptionHandler? Игнорировать исключение? Это приведет к тому, что EclipseLink будет действовать, поскольку эту ошибку можно проигнорировать, и последует куча других исключений. Я ищу способ запустить проверку ExclipeLink при первом использовании не при запуске. – Claude