HQL更新会清除二级缓存吗?

问题描述

| 本机查询正在清除第二级缓存条目。休眠论坛已有7年历史了,它回答说HQL更新查询也清除了第二级缓存。但这仍然是真的吗? 由于HQL查询具有要更新的确切字段以及在哪个实体中,因此我认为它的表现就不难像调用常规ѭ0一样。     

解决方法

  本机查询正在清除第二级缓存条目。 本机查询(实际上仅适用于本机插入/删除/更新,不用于查询)使所有缓存的第二级缓存条目(WHOLE CACHE)无效。我已经使用Hibernate的当前稳定版本4.1.9对此进行了验证。这是明智的,因为Hiberante可能无法知道数据库中的更改,因此唯一的选择是使整个第二级缓存无效。在某些严重依赖第二级缓存的系统中,这可能是一个严重的问题。 尽管有可能指定应使第二级缓存中的内容无效(甚至指定不从缓存中清除任何内容)。 请参阅很棒的博客文章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   更新查询还会清除第二级缓存。但这仍然是真的吗? HQL只会使与您要进行插入/更新/删除操作的实体相关的二级缓存区域无效。这是有道理的,因为Hibernate知道哪些实体受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 我想这与您使用哪个提供程序有很大关系。