【问题标题】:Does query and second level cache works in synchronization?查询和二级缓存是否同步工作?
【发布时间】: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


【解决方案1】:

查询缓存存储之前执行可缓存select查询返回的ID。

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

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

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

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

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

【讨论】:

  • 您说“Hibernate 会将查询返回的行的 ID 存储在其查询缓存中。它会将行本身存储在二级缓存中”你提到的查询?实际上我没有明白你的陈述中的 Ids/lines 是什么意思?
  • 查询选择 OrderLine 类型的实体。这些行是查询“select line from...”返回的 OrderLine 实例。 ID 是这些实体的 ID。
  • 所以必须启用二级缓存才能使用查询缓存。没有二级缓存就不能使用查询缓存吗?
  • 可以,但它可能会让事情变得更慢。即使启用了二级缓存,除非它用于几乎从不改变的查询,否则查询缓存也不是很有用。
  • 在我看来,没有二级缓存就无法使用查询缓存。原因是一旦我从实体公司删除 @Cacheable @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) 以禁用二级缓存,查询缓存也不起作用。我的理解有问题吗?
猜你喜欢
  • 2014-11-28
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2014-06-20
  • 2015-11-18
相关资源
最近更新 更多