2013-03-27 151 views
4

任何人都可以幫我解決這個問題。我將Infinispan用作二級緩存,將Hibernate用作ORM。我打開了enityt和查詢緩存。查詢緩存休眠加載實體

我有兩個查詢,例如Q1是 「從BokkEntity selet B B其中b.id < 5」 和其它類似的Q2是
第一次 「從BokkEntity b其中b.id < 7選擇B」 我我正在運行Q1,它將5個對象從持久存儲加載到緩存中。第一次運行第二次查詢會在Cache中加載7個對象。雖然前兩個對象在兩個查詢中都很常見。並根據我的理解查詢緩存總是隻存儲id,然後如果實體緩存在搜索上完成緩存內的查詢緩存中的對象,由ID引用。

所以我的問題是,爲什麼這兩個Q2再次加載所有的對象和 覆蓋這些在實體緩存,而我跑Q2(Q1運行後) 第一次。

我檢查過的查詢緩存對任何後續請求都正常工作。即,如果我重新運行Q1或Q2,則會從緩存中訪問數據。

這是緊急的,我會感激努力。

感謝

米娜

回答

1

Hibernate有沒有辦法告訴,這導致它已經除非它之前已經運行完全相同的查詢的查詢。因此這是預期的行爲。

每休眠documentation

如果您有遍地跑的查詢,使用相同的參數, 查詢緩存提供的性能提升。

注意短語:具有相同的參數

如果您要求hibernate通過id檢索實體,它可以輕鬆地搜索其緩存。但是對於之前沒有運行過的查詢,自上次運行以來可能已插入任何數量的事件(它僅在服務器上無效,它不會添加或更新遠程服務器緩存)。另外,有了查詢,hibernate對於使查詢緩存無效(任何時候數據庫更新發生,你很可能會失去所有緩存的查詢結果)都是過分(好東西)。

他們爲了確保你的2個查詢可以被合併和拆分而必須實現的邏輯將是非常複雜的,如果沒有你對數據庫結構和程序邏輯的深入瞭解,這些邏輯將是不可能的。

+0

此外,這似乎是一個關於使用查詢緩存的陷阱的好文章:http://tech.puredanger.com/2009/07/10/hibernate-query-cache/引用文章:「主要原因查詢緩存通常沒有用處,因爲表格修改會導致結果不斷失效。「 – 2013-06-01 05:01:56