1

我同时使用二级缓存和查询缓存。这是代码片段

//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”

所以看起来查询缓存和二级缓存彼此同步,因为查询缓存完成的更新是由二级缓存选择的。

更新:- 那么查询和二级缓存如何同步工作?我的意思是查询缓存是否首先在二级缓存下检查给定查询参数是否有任何更新?

4

1 回答 1

3

查询缓存存储先前执行可缓存选择查询返回的 ID。

假设您执行以下可缓存查询:

select line from OrderLine line join line.order order 
where line.status = ? and order.date = ?

如果执行一次,Hibernate 会将查询返回的行的 ID 存储在其查询缓存中。它会将行本身存储在二级缓存中。

如果您使用相同的参数第二次执行相同的查询,Hibernate 将从查询缓存中提取 ID,而不执行选择查询。然后它将通过 ID 获取每一行(这应该很快,因为这些行在二级缓存中)

如果您插入、更新或删除一行或订单,Hibernate 会检测到它。由于此修改可能会影响缓存查询的结果,因此查询缓存中与此查询关联的缓存条目将被逐出。所以下次你再次执行这个查询时,它将针对数据库执行,结果将再次存储在查询缓存中。

于 2014-05-11T10:36:15.140 回答