休眠查询缓存在外部更新时自动刷新?
我正在创建一个对数据库具有只读访问权限的服务。我在Hibernate中启用了查询缓存和第二级缓存(READ_ONLY模式)以加快服务速度,因为被访问的表很少更改。
我的问题是,如果有人进入数据库并手动更改表(即在Hibernate之外),缓存是否会自动识别出它需要被清除?缓存是否有时间限制?
我正在创建一个对数据库具有只读访问权限的服务。我在Hibernate中启用了查询缓存和第二级缓存(READ_ONLY模式)以加快服务速度,因为被访问的表很少更改。
我的问题是,如果有人进入数据库并手动更改表(即在Hibernate之外),缓存是否会自动识别出它需要被清除?缓存是否有时间限制?
不,缓存不会扫描数据库,以便在基础数据更改时神奇地自行更新。不通过 L2 缓存进行的更改将不会出现在其中。超时等需要多长时间取决于您的提供商以及默认设置。它看起来像默认的ehcache.xml是2分钟。
如果您不通过 Hibernate API 进行更改,则第二级缓存将不会收到通知,并且更改将不可见。处理这种情况的常用方法是以编程方式从第二级缓存中逐出相应的对象以强制刷新。提供了允许执行此操作的方法。从第19.3节。管理文档的缓存:SessionFactory
对于二级缓存,在 上定义了一些方法,用于逐出实例、整个类、集合实例或整个集合角色的缓存状态。
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