HQL更新是否清除了二级缓存?
本机查询正在清除第二级缓存条目。 来自7年前的hibernate论坛的回答说,HQL更新查询也清除了二级缓存。 但这仍然是真的吗?
由于HQL查询具有要更新的确切字段,并且在哪个实体中,我认为不应该像调用常规session.save(..)
那样难以表现。
本机查询正在清除第二级缓存条目。
- 本机查询(实际上这仅适用于本机插入/删除/更新,而不是查询)使所有高速缓存的第二级高速缓存条目无效(WHOLE CACHE)。 我已经用当前稳定版的Hibernatevalidation了这一点:4.1.9。 这是明智的,因为Hiberante不可能知道数据库中的更改,因此唯一的选择是使整个二级缓存无效。 在一些严重依赖二级缓存的系统中,这可能是一个严重的问题。
虽然有可能指定来自二级缓存的内容应该无效(或者甚至指定没有任何内容从缓存中逐出)。 看看伟大的博客文章http://www.link-intersystems.com/bin/view/Blog/Hibernate%27s+second+level+cache+and+n++queries ,这些都是彻底解释的。
为了防止Hibernate使缓存中的任何内容失效:
SQLQuery sqlQuery = session.createSQLQuery("ALTER SESSION SET NLS_COMP = 'BINARY'"); sqlQuery.addSynchronizedQuerySpace(""); int updatedEntities = sqlQuery.executeUpdate();
要指示Hibernate仅使Person实体缓存无效:
SQLQuery sqlQuery = session.createSQLQuery("UPDATE PERSON SET ... WHERE ..."); sqlQuery.addSynchronizedEntityClass(Person.class); int updatedEntities = sqlQuery.executeUpdate();
来自7年前的hibernate论坛的回答说,HQL更新查询也清除了二级缓存。 但这仍然是真的吗?
- HQL仅使第二级缓存区域无效,该区域与您正在执行某些插入/更新/删除的实体相关。 这是有道理的,因为Hibernate知道哪些实体受HQL影响,它只能清除该实体的第二级缓存区域。
例:
entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();
这将使“实体”缓存“仅”无效。
在HQL方面,我不知道有任何可能阻止Hibernate使特定实体的二级缓存失效。
在使用Hibernate 3.2.x运行时,我们确实看到HQL更新清除了二级缓存
作为validation个人设置的简单方法,请执行以下操作:
http://narcanti.keyboardsamurais.de/hibernate-statistics-jsp-reloaded.html
在运行HQL更新事务之前和之后,请注意该页面上的详细信息…
或者直接在代码中和/或使用JMX收集统计信息
http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-monitoring
至于改进的行为,Hibernate项目可能会打开来实现补丁:)
我最接近的是: http : //docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache
我想这与你使用的提供商有很大关系。