簡體   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