Ehcache在群集

时间:2017-09-20 06:01:51

标签: spring-boot redis cluster-computing spring-cache

我的应用程序有一个单独的应用程序,提供给spring Ehcache.It工作正常。重要的是要知道缓存配置是服务方法,并且延迟加载对于从DB查询的所有对象都是如此。像这样:

@Transactional
@Override
@Caching(evict = { @CacheEvict(value = "schoolCache", key = "#school.id")})
public Integer save(School school) {
        // Code here
}

很明显,Ehcache中保存的是懒惰的学校实例。在控制器层有ModelMapper在Model和ViewModel之间交换数据,如下所示:

@RequestMapping(value = "/load/{Id}", method = RequestMethod.GET)
@ResponseBody
public SchoolViewModel load(@PathVariable Integer Id) {
        SchoolViewModel schoolViewModel = ModelMapper.map(schoolService.loadByEntityId(Id), SchoolViewModel.class);
        return schoolViewModel;
    }

如果SchoolViewModel具有进入学校的对象属性,则由ModelMapper从控制器的DB中获取。 所以我将应用程序集群并将Ehcache配置为Redis 问题是什么?在开始请求来自SchoolService的请求时,来自DB的这个服务查询以及因为hibernate的会话已经打开,ModelMapper成功地将Model映射到ViewModel。第二次调用id与id相同的服务方法时间从Redis获得学校对象并且没有Hiberante的会话,ModelMapper想要映射到学校的对象的属性得到异常。例外是这样的:

  

引起:org.hibernate.LazyInitializationException:不能   初始化代理 - 没有会话   org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)     在   org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)     在   org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)

那我该怎么办?帮助我的最好方法是什么? 非常感谢

1 个答案:

答案 0 :(得分:1)

正如我在my book中解释的那样,您需要初始化服务方法中进一步需要的所有关联:

recognitionTask

所以,你有多种选择:

  1. 您可以使用JOIN FETCH with a JPQL query
  2. 您可以使用altbeacon.beacon.BeaconHibernate.unproxy(proxy)
  3. 您可以直接浏览LAZY协会。
  4. 您可以使用DTO projection,但绝不会碰到任何schoolService.loadByEntityId(Id), SchoolViewModel.class)