繁体   English   中英

查询和二级缓存是否同步工作?

[英]Does query and second level cache works in synchronization?

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

//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块)我在第一个块中获得但是我得到了更新的记录(通过第二个块中的查询更新完成),即第1行的“newCompany”

因此查询缓存和二级缓存看起来相互同步,因为查询缓存完成的更新被二级缓存选中。

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

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

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

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

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

如果第二次执行相同的查询,使用相同的参数,Hibernate将从查询缓存中提取ID,而不执行select查询。 然后它将按ID获取每一行(由于行在二级缓存中,因此应该很快)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM