0

我使用 Spring 数据 Redis 来缓存 Redis 中的序列化 JPA 实体org.springframework.data.redis.cache.RedisCacheManager

这是方法:

@Override
@Cacheable(value = MapCacheConfiguration.DATABASE_CACHE_NAME, key = "#root.method.name")
public Curriculum findCurriculumByMemberId(Long memberId) {
    return curriculumRepository.findCurriculumByMemberId(memberId);
}

不幸的是,在我的启动应用程序重新启动后,实体仍然缓存在 Redis 中,我得到一个org.hibernate.LazyInitializationException

这可能是由于本文中描述的原因即通过休眠访问分离的对象 - 在我的情况下,序列化对象留在缓存中。

有人可以建议处理这个问题的策略吗?

  1. 我是否应该在销毁我的应用程序时清理/清空缓存,记住重新填充缓存的过程很昂贵,并且应用程序将托管在云(Heroku)中,其中测功机/容器被销毁并重新创建(因此重新启动) 相当频繁。
  2. 或者有没有办法将缓存的实体重新附加到实体管理器?
  3. 有更好的解决方案吗?
4

1 回答 1

1

从未使用过 Redis,但如果您的缓存应该在应用程序重新启动时保持不变,您可能希望在缓存实体之前获取所有需要的关系。另一个问题可能是那些缓存的实体是分离的,如果您想在事务中再次使用它们,这可能是一个问题。当然,您可以通过调用重新附加它们merge(entity),另一方面,这可能会导致用缓存的数据覆盖新数据时出现问题。

持久缓存要考虑的另一件事是类版本,因为如果您在重新部署之间更改类,如果缓存已经填充了先前类版本的实例,反序列化将失败。

于 2014-10-23T15:44:35.883 回答