我正在使用二级缓存和查询缓存。这是代码段
//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块)我在第一个块得到了但是我得到了更新的记录(通过第二块中的查询更新完成),即" newCompany"在第1行
所以看起来像查询缓存和二级缓存是同步的 由查询缓存完成的更新由二级缓存挑选。
更新: - 那么查询和二级cahe如何同步工作?我的意思是查询缓存首先检查 在二级缓存下是否有给定查询参数的任何更新?
答案 0 :(得分:3)
查询缓存存储先前执行的可缓存选择查询返回的ID。
假设您执行以下可缓存查询:
select line from OrderLine line join line.order order
where line.status = ? and order.date = ?
如果执行一次,Hibernate会将查询返回的行的ID存储在其查询缓存中。它会将行本身存储在二级缓存中。
如果第二次执行相同的查询,使用相同的参数,Hibernate将从查询缓存中提取ID,而不执行select查询。然后它将按ID获取每一行(由于行在二级缓存中,因此应该很快)
如果你插入,更新或删除一行或一个订单,Hibernate会检测到它。由于此修改可能会影响缓存查询的结果,因此将逐出与查询缓存中与此查询关联的缓存条目。因此,下次再次执行此查询时,它将针对数据库执行,结果将再次存储在查询缓存中。