【发布时间】:2011-08-31 00:16:30
【问题描述】:
本机查询正在清除二级缓存条目。来自 7 年历史的休眠论坛的回答说 HQL 更新查询也会清除二级缓存。但这仍然是真的吗?
由于 HQL 查询具有要更新的确切字段以及在哪个实体中更新,我认为它不应该像调用常规 session.save(..) 那样表现得那么难。
【问题讨论】:
本机查询正在清除二级缓存条目。来自 7 年历史的休眠论坛的回答说 HQL 更新查询也会清除二级缓存。但这仍然是真的吗?
由于 HQL 查询具有要更新的确切字段以及在哪个实体中更新,我认为它不应该像调用常规 session.save(..) 那样表现得那么难。
【问题讨论】:
本机查询正在清除二级缓存条目。
虽然可以指定二级缓存中的哪些内容应该无效(或者甚至指定不从缓存中逐出任何内容)。 查看精彩的博文http://www.link-intersystems.com/bin/view/Blog/Hibernate%27s+second+level+cache+and+native+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 年历史的休眠论坛的回答说 HQL 更新查询也会清除二级缓存。但这仍然是真的吗?
例子:
entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();
这将使“仅”Person 实体缓存无效。
当涉及到 HQL 时,我不知道有任何可能阻止 Hibernate 使特定实体的二级缓存无效。
【讨论】:
当使用 Hibernate 3.2.x 运行时,我们确实看到 HQL 更新清除了二级缓存
作为验证您的个人设置的简单方法,请实现以下内容:
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
我想这与您使用的提供商有很大关系。
【讨论】: