EclipseLink + JPA Guice Persist и передислокации
У меня есть инфраструктура на основе EclipseLink + JPA Guice Persist
При повторном развертывании приложения у меня возникают проблемы с кэшированием сущностей, и мне приходится перезагружать сервер (Oracle Weblogic 11g) . Эта проблема рассматривается в этом посте: https://bugs.eclipse.org/bugs/show_bug.cgi?id=326552 Но, может быть, это не ошибка?...
Мне удалось решить проблему следующим образом:
Первоначально я централизовал все в GuiceModule:
1. Создайте модуль JPAPersist
2. Привязка класса Initializer, вызывающего persistenceService.start()
public class MyGuiceModule implements Module {
@Override
public void configure(final Binder binder) {
Properties props = _dbConnectionPropertiesForPool();
JpaPersistModule jpaModule = new JpaPersistModule(persistenceUnit);
jpaModule.properties(props);
binder.install(jpaModule);
binder.bind(JPAInitializer.class).asEagerSingleton();
}
public class JPAInitializer {
@Inject
public JPAInitializer(final PersistService service) {
service.start();
}
}
Все отлично работает.... но как я уже говорил при повторном развертывании остаются кэшированные экземпляры
КАК Я РЕШЕН?
Я изменил метод JPAInitializer
открытый статический класс JPAInitializer {
private static PersistService _persistenceService = null; @Inject public JPAInitializer(final PersistService service) { _persistenceService = service; _persistenceService.start(); } public static void stop() { _persistenceService.stop(); } }
Я создал метод stop (), который останавливает службу.. но WTF! Я был вынужден сохранить внедренную службу персистентности в статической переменной:((
Из фильтра прослушивания / прослушивания, который является точкой входа, вызывайте остановку, когда приложение не развернуто (onContextDestroyed)
public void contextDestroyed (ServletContextEvent servletContextEvent) {JPAInitializer.stop ();
}
Теперь при повторном развертывании нет проблем с кешем и нет необходимости перезагружать сервер
Это работает таким образом, но я не знаю, все ли в порядке для создания статического экземпляра PesistenceService., Поэтому я пытаюсь найти другой способ вызвать остановку.....
Любое предложение?
1 ответ
Нашел решение.
Создайте интерфейс для работы с Guice Persistence Service:
интерфейс MyPersistenceServiceHandler {
public void start(); public void stop();
}
Это будет использовано в основном модуле DB Guice:
binder.bind (MyPersistenceServiceHandler.class)
.to (JPAPersistenceServiceControl.class).in (Singleton.class);статический класс JPAPersistenceServiceControl реализует MyPersistenceServiceHandler {
private final PersistService _service; @Inject public JPAPersistenceServiceControl(final PersistService service) { _service = service; } @Override public void start() { if (_service == null) throw new IllegalStateException("NO persistence service available!"); _service.start(); } @Override public void stop() { if (_service == null) throw new IllegalStateException("NO persistence service available!"); _service.stop(); }
}
Получить экземпляр в фильтре RESTEndoint/Guice через Guice Injector.
jpaServiceHandler = _myGuiceInjector.getInstance (MyPersistenceServiceHandler.class);
Запустите службу в contextInitialized: jpaServiceHandler.start();
Остановите службу в contextDeproyed: jpaServiceHandler.stop();