我们有一个应用程序,它使用Hibernate的二级缓存来避免数据库命中.
我想知道当外部进程(如MySQL管理员)直接连接以修改数据库(更新/插入/删除)时,是否有一些简单的方法可以使Java应用程序的Hibernate二级缓存无效.
我们使用EHCache作为我们的二级缓存实现.
我们混合使用@Cache(Usage=CacheConcurrencyStrategy y.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的二级缓存没有真正的方法知道数据库中的某个实体发生了更改,除非它查询该实体(缓存正在保护您不受该实体的影响).因此,作为一种解决方案,我们可以简单地调用一些方法来强制二级缓存逐出所有内容(同样,由于缺乏锁定和并发控制,您有可能会在进行中的事务中"读取"或更新过时的数据).