HQL更新是否清除了二级缓存?

本机查询正在清除第二级缓存条目。 来自7年前的hibernate论坛的回答说,HQL更新查询也清除了二级缓存。 但这仍然是真的吗?

由于HQL查询具有要更新的确切字段,并且在哪个实体中,我认为不应该像调用常规session.save(..)那样难以表现。

本机查询正在清除第二级缓存条目。

  1. 本机查询(实际上这仅适用于本机插入/删除/更新,而不是查询)使所有高速缓存的第二级高速缓存条目无效(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更新查询也清除了二级缓存。 但这仍然是真的吗?

  1. 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

我想这与你使用的提供商有很大关系。