我们有一个使用Hibernate的二级缓存来避免数据库命中的应用程序.
我想知道当一个外部进程如MySQL管理员直接连接修改数据库(更新/插入/删除)时,是否有一些简单的方法可以使Java应用程序的Hibernate二级缓存无效.
我们使用EHCache作为我们的二级缓存实现.
我们混合使用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)和@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE),并且我们没有在每个实体上使用时间戳启用Optimistic并发控制.
SessionFactory包含管理二级缓存的方法: - 管理缓存
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
Run Code Online (Sandbox Code Playgroud)
但是因为我们使用@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);
}
}
Run Code Online (Sandbox Code Playgroud)
Hibernate的二级缓存没有真正的方法来知道数据库中的实体发生了变化,除非它查询该实体(缓存正在保护您的实体).因此,作为一种解决方案,我们可以简单地调用一些方法来强制二级缓存驱逐一切(再次因为缺乏锁定和并发控制,您可能会因"读取"或更新过时数据而导致进程中的事务风险).
我有一个关于Hibernate缓存机制的问题.我在文章中读到了hibernate中本机SQLquery的执行,使缓存的所有区域无效,因为hibernate对它将影响哪个特定实体一无所知.这里缓存的所有区域意味着我们在谈论二级缓存的各个区域或两级缓存(第一级缓存,二级缓存)还是仅二级缓存或仅第一级缓存?