Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查询和二级缓存是否同步工作?_Java_Hibernate_Second Level Cache_Query Cache - Fatal编程技术网

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

Java 查询和二级缓存是否同步工作?,java,hibernate,second-level-cache,query-cache,Java,Hibernate,Second Level Cache,Query Cache,我同时使用二级缓存和查询缓存。下面是代码片段 //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.create

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

//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();
在第二个块中,我在查询中进行了更新。在第三个区块,我通过二级缓存获取公司记录。我所期望的是,我将得到与第一个块中相同的结果(在第三个块中),但我得到了更新的记录(在第二个块中通过查询更新完成),即第1行的“新公司”

所以看起来查询缓存和二级缓存是同步的 查询缓存完成的更新由二级缓存拾取

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

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

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

select line from OrderLine line join line.order order 
where line.status = ? and order.date = ?
如果执行一次,Hibernate将把查询返回的行的ID存储在其查询缓存中。它会将这些行本身存储在二级缓存中

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


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

我认为设置可缓存的更新查询没有任何效果。select查询可以是可缓存的,如果使用相同的参数重新执行,它会告诉Hibernate从缓存中检索其结果。我不明白你的问题。当然,Hibernate会尽力确保查询返回正确的结果。如果更改实体的值,缓存将被更新或刷新。@请确定我的问题中不清楚的部分。请参阅我的更新您说过“Hibernate将把查询返回的行的ID存储在其查询缓存中。它将把行本身存储在二级缓存中”您提到的查询中的ID和行是什么?实际上,我没有理解您的语句中ID/lines的含义?查询选择OrderLine类型的实体。这些行是查询“select line from…”返回的OrderLine的实例。ID是这些实体的ID。因此,必须启用二级缓存才能使用查询缓存。如果没有二级缓存,查询缓存就不能使用吗?可以,但它可能会使事情变得更慢。即使启用了二级缓存,除非它用于几乎永远不会更改的查询,否则查询缓存也不是那么有用。在我看来,如果没有二级缓存,就不可能使用查询缓存。原因是只要我从实体公司移除@Cacheable@Cache(用法=cacheconcurrencysttrategy.READ\u WRITE)以禁用二级缓存,查询缓存就无法工作。我的理解有问题吗?