本机查询正在清除二级缓存条目。来自7年前的hibernate论坛的回答说,HQL更新查询也清除了二级缓存。但这仍然是真的吗?
由于HQL查询具有要更新的确切字段,以及在哪个实体中,我认为不应该像调用常规session.save(..)
那样难以表现。
答案 0 :(得分:11)
本机查询正在清除二级缓存条目。
虽然有可能指定来自二级缓存的内容应该无效(或者甚至指定没有任何内容从缓存中逐出)。 看一下很棒的博客文章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岁的hibernate论坛的答案说HQL 更新查询还清除了二级缓存。但这仍然是真的吗?
示例:
entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();
这将使“实体”缓存“仅”无效。
我不知道在HQL方面阻止Hibernate使特定实体的二级缓存失效的可能性。
答案 1 :(得分:1)
我们确实看到HQL更新在使用Hibernate 3.2.x运行时清除了二级缓存
作为验证个人设置的简单方法,请执行以下操作:
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项目可能会打开以实现补丁:)
答案 2 :(得分:0)
我能挖到的最接近的是: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache
我认为它与您使用的提供商有很多关系。