【问题标题】:Does HQL update clear 2nd level cache?HQL 更新是否清除二级缓存?
【发布时间】:2011-08-31 00:16:30
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

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

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

    例子:

    entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();
    

    这将使“仅”Person 实体缓存无效。

    当涉及到 HQL 时,我不知道有任何可能阻止 Hibernate 使特定实体的二级缓存无效。

    【讨论】:

      【解决方案2】:

      当使用 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 项目可能会开放以实施补丁:)

      【讨论】:

        【解决方案3】:

        我能挖掘出的最接近的东西是: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

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

        【讨论】:

          猜你喜欢
          • 2017-07-05
          • 2019-07-06
          • 1970-01-01
          • 1970-01-01
          • 2015-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多