我们有一个应用程序,使用Hibernate的二级缓存来避免数据库查询。
我想知道是否有一种简单的方法在外部进程(例如直接连接到修改数据库的MySQL管理员)时使Java应用程序的Hibernate二级缓存失效(更新/插入/删除)。
我们使用EHCache作为我们的二级缓存实现。
我们使用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)和@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)混合使用,并且没有启用乐观并发控制,在每个实体上使用时间戳。
SessionFactory包含管理二级缓存的方法: - Managing the Caches
我想知道是否有一种简单的方法在外部进程(例如直接连接到修改数据库的MySQL管理员)时使Java应用程序的Hibernate二级缓存失效(更新/插入/删除)。
我们使用EHCache作为我们的二级缓存实现。
我们使用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)和@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)混合使用,并且没有启用乐观并发控制,在每个实体上使用时间戳。
SessionFactory包含管理二级缓存的方法: - Managing the Caches
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
但是因为我们使用@Cache注释单个实体类,所以没有一个可靠的中央位置可以让我们将其添加到列表中(例如没有手动步骤)。
// Easy to forget to update this to properly evict the class
public static final Class[] cachedEntityClasses = {Cat.class, Dog.class, Monkey.class}
public void clear2ndLevelCache() {
SessionFactory sessionFactory = ... //Retrieve SessionFactory
for (Class entityClass : cachedEntityClasses) {
sessionFactory.evict(entityClass);
}
}
在没有查询实体的情况下,Hibernate的二级缓存无法知道实体在数据库中是否发生了更改(这正是缓存所保护您免受的)。因此,也许我们可以通过调用某些方法来强制清除二级缓存中的所有内容作为解决方案(再次由于缺乏锁定和并发控制,您可能会冒着正在进行的事务从“读取”或更新陈旧数据的风险)。