【发布时间】:2014-06-28 18:02:03
【问题描述】:
我同时使用二级缓存和查询缓存。这是代码sn-p
//first block
session = factory.openSession();
company1=(Company)session.get(Company.class, 1);
session.close();
//second block
session = factory.openSession();
tx = session.beginTransaction();
Query updateQuery=session.createQuery("update Company set companyName = 'newCompany' where companyId=1");
updateQuery.setCacheable(true);
updateQuery.executeUpdate();
tx.commit();
session.close();
//Third block
session = factory.openSession();
company1=(Company)session.get(Company.class, 1); // line 1
session.close();
在第二个块中,我在查询中进行了更新。在第三块中,我通过二级缓存获取公司记录。我期望我会得到相同的结果(在第 3 个块中)我在第一个块中得到的结果,但我得到了更新的记录(通过在第 2 个块中的查询更新完成),即第 1 行的“newCompany”
所以看起来查询缓存和二级缓存是同步的 查询缓存完成的更新由二级缓存选择。
更新:- 那么查询和二级缓存如何同步工作呢?我的意思是查询缓存是否首先检查 在二级缓存下,给定的查询参数是否有任何更新?
【问题讨论】:
-
我认为设置可缓存的更新查询没有任何效果。选择查询可以是可缓存的,如果它使用相同的参数重新执行,则告诉 Hibernate 从缓存中检索其结果。我不明白你的问题。当然,Hibernate 会尽力确保查询返回正确的结果。如果更改实体的值,缓存将被更新或刷新。
-
@JB Nizet 在我的问题中不清楚哪一部分。查看我的更新
标签: java hibernate second-level-cache query-cache