我正在创建一个对数据库具有只读访问权限的服务。我在Hibernate中有一个查询缓存和二级缓存(READ_ONLY模式)来加速服务,因为被访问的表很少变化。
我的问题是,如果有人进入数据库并手动更改表(即在Hibernate之外),缓存是否会自动识别需要清除它?缓存有时间限制吗?
答案 0 :(得分:7)
不,当基础数据发生变化时,缓存不会扫描数据库,让您神奇地自我更新。未通过L2缓存的更改不会出现在其中。超时等等多长时间取决于您的提供商以及默认设置。看起来默认的ehcache.xml是2分钟。
答案 1 :(得分:7)
如果您没有通过Hibernate API进行更改,则不会通知二级缓存,并且不会显示更改。处理这种情况的常用方法是以编程方式从二级缓存中逐出相应的对象以强制刷新。 SessionFactory
提供了允许执行此操作的方法。从文档的19.3. Managing the caches部分:
对于二级缓存,有
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