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

Boz*_*zho 16 java hibernate

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

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

Mar*_*iak 12

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

  1. 本机查询(实际上这仅适用于本机插入/删除/更新,而不是查询)使所有高速缓存的第二级高速缓存条目无效(WHOLE CACHE).我已经用当前稳定版的Hibernate验证了这一点:4.1.9.这是明智的,因为Hiberante不可能知道DB中的更改,因此唯一的选择是使整个二级缓存无效.在一些严重依赖二级缓存的系统中,这可能是一个严重的问题.

虽然有可能指定来自二级缓存的内容应该无效(或者甚至指定没有任何内容从缓存中逐出).看看伟大的博客文章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();
Run Code Online (Sandbox Code Playgroud)

要指示Hibernate仅使Person实体缓存无效:

SQLQuery sqlQuery = session.createSQLQuery("UPDATE PERSON SET ... WHERE ...");
sqlQuery.addSynchronizedEntityClass(Person.class);
int updatedEntities = sqlQuery.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

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

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

例:

entityManager.createQuery("delete from Person p where p.id = 1").executeUpdate();
Run Code Online (Sandbox Code Playgroud)

这将使"实体"缓存"仅"无效.

我不知道在HQL方面阻止Hibernate使特定实体的二级缓存失效的可能性.


Woo*_*Moo 0

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

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