1. 程式人生 > >Hibernate的快取策略 二

Hibernate的快取策略 二

上篇部落格中hibernate快取,我們繼續說 查詢快取。

三、查詢快取

查詢快取,顧明思議它是查詢的時候產生的緩衝,那麼就要問了,剛剛在一級快取,二級快取中的load,get不一樣是查詢嗎?那是什麼樣的查詢呢?

查詢快取是針對普通屬性結果集的快取,對實體物件的結果集只快取id,這裡的ID不是物件的真正ID,它與查詢的條件 相關,即where後的條件相關,不同的查詢條件,其快取的id也不一樣 。如where age > 10 和 where age >18 就是兩個不同的查詢快取ID。

生命週期

當前關聯的表發生修改 ,或是 查詢條件改變時,那麼查詢快取生命週期結束。

查詢快取的條件

有需要重複查詢使用的緩衝,如果你兩個查詢不一樣,這個存在的緩衝是不起作用的。

那我們前面講到了二級快取,二級快取和查詢快取是什麼關係?

上篇中提到一級,二級快取是快取實體物件的,不快取普通屬性結果集,而查詢快取是對一級,二級快取的一個補充,對非實體的結果集快取。

使用:

  • 查詢緩衝一般設定在list()方法中。
     
  • 查詢緩衝必須要告訴hibernate,使用查詢緩衝,查詢緩衝才會生效。
    第一步:在cfg中設定:
<!-- 啟用查詢快取,預設是false是不起用的 -->
<property name="hibernate.cache.use_query_cache"
>
true</property>

第二步:在程式中起用

 query.setCacheable(true);

這就是查詢快取。

四、總結

快取要慎用,補充一下使用Hibernate二級快取的條件:

1) 很少被修改的資料   
2) 不是很重要的資料,允許出現偶爾併發的資料   
3) 不會被併發訪問的資料   
4) 常量資料
  
不適合存放到第二級快取的資料?  
 
1) 經常被修改的資料   
2) 絕對不允許出現併發訪問的資料,如財務資料,絕對不允許出現併發   
3) 與其他應用共享的資料。

最後引用網路上前輩的話送給大家:

不要想當然的以為快取一定能提高效能,僅僅在你能夠駕馭它並且條件合適的情況下才是這樣的。hibernate的二級快取限制還是比較多的,不方便用jdbc可能會大大的降低更新效能。在不瞭解原理的情況下亂用,可能會有1+N的問題。不當的使用還可能導致讀出髒資料。如果受不了hibernate的諸多限制,那麼還是自己在應用程式的層面上做快取吧。
在越高的層面上做快取,效果就會越好。就好像儘管磁碟有快取,資料庫還是要實現自己的快取,儘管資料庫有快取,咱們的應用程式還是要做快取。因為底層的快取它並不知道高層要用這些資料幹什麼,只能做的比較通用,而高層可以有針對性的實現快取,所以在更高的級別上做快取,效果也要好些吧。