Caching 日食线+;JPA Guice持续和重新部署

Caching 日食线+;JPA Guice持续和重新部署,caching,jpa,eclipselink,weblogic-10.x,guice-persist,Caching,Jpa,Eclipselink,Weblogic 10.x,Guice Persist,我有一个基于EclipseLink+JPA Guice的基础设施 当我重新部署应用程序时,我总是会遇到缓存实体的缓存问题,并且我必须重新启动服务器(Oracle Weblogic 11g)。这个问题在本文的一篇文章中得到了处理:但是,可能不是一个bug 我设法解决了以下问题: 最初,我将所有内容集中在一个GuiceModule中: 1.创建模块JPAPersist 2.初始值设定项类thas的绑定调用persistenceService.start() 一切正常。。。。但正如我所说的,重新部署时

我有一个基于EclipseLink+JPA Guice的基础设施

当我重新部署应用程序时,我总是会遇到缓存实体的缓存问题,并且我必须重新启动服务器(Oracle Weblogic 11g)。这个问题在本文的一篇文章中得到了处理:但是,可能不是一个bug

我设法解决了以下问题:

最初,我将所有内容集中在一个GuiceModule中:

1.创建模块JPAPersist

2.初始值设定项类thas的绑定调用persistenceService.start()

一切正常。。。。但正如我所说的,重新部署时仍保留缓存实例

我是如何解决的?

  • 我更改了JPAIInitializer的方法

    公共静态类JPAIInitializer{

        private static PersistService _persistenceService = null;
    
        @Inject
        public JPAInitializer(final PersistService service) {
            _persistenceService = service;          
            _persistenceService.start();            
        }       
        public static void stop() {
            _persistenceService.stop();
        }
    }
    
  • 我创建了一个停止服务的方法stop()。但是WTF!我被迫将注入的持久性服务保存在一个静态变量中:((

  • 从作为入口点的guice/listener筛选器,在应用程序取消部署时调用停止(onContextDestroyed)

    公共无效上下文已销毁(ServletContextEvent ServletContextEvent){ jpainInitializer.stop();
    }

  • 现在,当我重新部署时,没有缓存问题,也不需要重新启动服务器

    它是这样工作的,但是我不知道创建一个静态实例PesistenceService是否合适,所以我正在尝试另一种方法来调用stop

    有什么建议吗?

    找到了解决方案

  • 创建一个接口来处理Guice持久性服务:

    接口MyPersistenceServiceHandler{

     public void start();
    
     public void stop(); 
    
    }

    这将用于主DB GUI模块:

    bind.bind(MyPersistenceServiceHandler.class)
    .to(JPAPersistenceServiceControl.class) .在(独生子女班)

    静态类JPaperResistenceServiceControl 实现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();
         }
    
    }

  • 通过Guice注入器在RESTEndoint/Guice过滤器中获取实例

    jpaServiceHandler=\u myGuiceInjector.getInstance(MyPersistenceServiceHandler.class)

  • 在contextInitialized上启动服务:jpaServiceHandler.Start()

  • 停止contextDeproyed上的服务:jpaServiceHandler.Stop()

  • 如果正确停止persistenceService,则不会出现错误。
         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();
         }