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

时间:2011-05-23 09:15:15

标签: java hibernate

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

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

3 个答案:

答案 0 :(得分:11)

  

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

  1. 本机查询(实际上这仅适用于本机插入/删除/更新,而不是查询)使所有高速缓存的第二级高速缓存条目无效(WHOLE CACHE)。我已经用当前稳定版的Hibernate验证了这一点:4.1.9。这是明智的,因为Hiberante不可能知道DB中的更改,因此唯一的选择是使整个二级缓存无效。在一些严重依赖二级缓存的系统中,这可能是一个严重的问题。
  2. 虽然有可能指定来自二级缓存的内容应该无效(或者甚至指定没有任何内容从缓存中逐出)。 看一下很棒的博客文章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   更新查询还清除了二级缓存。但这仍然是真的吗?

    1. HQL仅使第二级缓存区域无效,该区域与您正在执行某些插入/更新/删除的实体相关。这是有道理的,因为Hibernate知道哪些实体受HQL影响,它只能清除该实体的第二级缓存区域。
    2. 示例:

      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

我认为它与您使用的提供商有很多关系。