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();
    }
}

Все отлично работает.... но как я уже говорил при повторном развертывании остаются кэшированные экземпляры

КАК Я РЕШЕН?

  1. Я изменил метод JPAInitializer

    открытый статический класс JPAInitializer {

        private static PersistService _persistenceService = null;
    
        @Inject
        public JPAInitializer(final PersistService service) {
            _persistenceService = service;          
            _persistenceService.start();            
        }       
        public static void stop() {
            _persistenceService.stop();
        }
    }
    
  2. Я создал метод stop (), который останавливает службу.. но WTF! Я был вынужден сохранить внедренную службу персистентности в статической переменной:((

  3. Из фильтра прослушивания / прослушивания, который является точкой входа, вызывайте остановку, когда приложение не развернуто (onContextDestroyed)

    public void contextDestroyed (ServletContextEvent servletContextEvent) {JPAInitializer.stop ();
    }

Теперь при повторном развертывании нет проблем с кешем и нет необходимости перезагружать сервер

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

Любое предложение?

1 ответ

Нашел решение.

  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();
         }
    

    }

  2. Получить экземпляр в фильтре RESTEndoint/Guice через Guice Injector.

    jpaServiceHandler = _myGuiceInjector.getInstance (MyPersistenceServiceHandler.class);

  3. Запустите службу в contextInitialized: jpaServiceHandler.start();

  4. Остановите службу в contextDeproyed: jpaServiceHandler.stop();

Другие вопросы по тегам