隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          1.1.1.         基本的緩存原理
          Hibernate緩存分為二級,第一級存放于session中稱為一級緩存,默認帶有且不能卸載。



          第二級是由sessionFactory控制的進程級緩存。是全局共享的緩存,凡是會調用二級緩存的查詢方法 都

          會從中受益。只有經正確的配置后二級緩存才會發揮作用。同時在進行條件查詢時必須使用相應的方法

          才能從緩存中獲取數據。比如Query.iterate()方法、load、get方法等。必須注意的是session.find方

          法永遠是從數據庫中獲取數據,不會從二級緩存中獲取數據,即便其中有其所需要的數據也是如此。



          查詢時使用緩存的實現過程為:首先查詢一級緩存中是否具有需要的數據,如果沒有,查詢二級緩存,

          如果二級緩存中也沒有,此時再執行查詢數據庫的工作。要注意的是:此3種方式的查詢速度是依次降低

          的。

          1.2.   存在的問題
          1.2.1.      一級緩存的問題以及使用二級緩存的原因
               因為Session的生命期往往很短,存在于Session內部的第一級最快緩存的生命期當然也很短,所以

          第一級緩存的命中率是很低的。其對系統性能的改善也是很有限的。當然,這個Session內部緩存的主要

          作用是保持Session內部數據狀態同步。并非是hibernate為了大幅提高系統性能所提供的。

          為了提高使用hibernate的性能,除了常規的一些需要注意的方法比如:

          使用延遲加載、迫切外連接、查詢過濾等以外,還需要配置hibernate的二級緩存。其對系統整體性能的

          改善往往具有立竿見影的效果!

          (經過自己以前作項目的經驗,一般會有3~4倍的性能提高)



          1.2.2.      N+1次查詢的問題
          執行條件查詢時,iterate()方法具有著名的 “n+1”次查詢的問題,也就是說在第一次查詢時

          iterate方法會執行滿足條件的查詢結果數再加一次(n+1)的查詢。但是此問題只存在于第一次查詢時

          ,在后面執行相同查詢時性能會得到極大的改善。此方法適合于查詢數據量較大的業務數據。

          但是注意:當數據量特別大時(比如流水線數據等)需要針對此持久化對象配置其具體的緩存策略,比

          如設置其存在于緩存中的最大記錄數、緩存存在的時間等參數,以避免系統將大量的數據同時裝載入內

          存中引起內存資源的迅速耗盡,反而降低系統的性能!!!



          1.3.   使用hibernate二級緩存的其他注意事項:
          1.3.1.      關于數據的有效性
          另外,hibernate會自行維護二級緩存中的數據,以保證緩存中的數據和數據庫中的真實數據的一致性!

          無論何時,當你調用save()、update()或 saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()

          、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。

          當隨后flush()方法被調用時,對象的狀態會和數據庫取得同步。



          也就是說刪除、更新、增加數據的時候,同時更新緩存。當然這也包括二級緩存!



          只要是調用hibernate API執行數據庫相關的工作。hibernate都會為你自動保證 緩存數據的有效性!!



          但是,如果你使用了JDBC繞過hibernate直接執行對數據庫的操作。此時,Hibernate不會/也不可能自行

          感知到數據庫被進行的變化改動,也就不能再保證緩存中數據的有效性!!



          這也是所有的ORM產品共同具有的問題。幸運的是,Hibernate為我們暴露了Cache的清除方法,這給我們

          提供了一個手動保證數據有效性的機會!!

          一級緩存,二級緩存都有相應的清除方法。



          其中二級緩存提供的清除方法為:

          按對象class清空緩存

                          按對象class和對象的主鍵id清空緩存

                          清空對象的集合中的緩存數據等。

             

          1.3.2.      適合使用的情況
          并非所有的情況都適合于使用二級緩存,需要根據具體情況來決定。同時可以針對某一個持久化對象配

          置其具體的緩存策略。



          適合于使用二級緩存的情況:

          1、數據不會被第三方修改;



          一般情況下,會被hibernate以外修改的數據最好不要配置二級緩存,以免引起不一致的數據。但是如果

          此數據因為性能的原因需要被緩存,同時又有可能被第3方比如SQL修改,也可以為其配置二級緩存。只

          是此時需要在sql執行修改后手動調用cache的清除方法。以保證數據的一致性



            2、數據大小在可接收范圍之內;



               如果數據表數據量特別巨大,此時不適合于二級緩存。原因是緩存的數據量過大可能會引起內存資

          源緊張,反而降低性能。



          如果數據表數據量特別巨大,但是經常使用的往往只是較新的那部分數據。此時,也可為其配置二級緩

          存。但是必須單獨配置其持久化類的緩存策略,比如最大緩存數、緩存過期時間等,將這些參數降低至

          一個合理的范圍(太高會引起內存資源緊張,太低了緩存的意義不大)。



            3、數據更新頻率低;



               對于數據更新頻率過高的數據,頻繁同步緩存中數據的代價可能和 查詢緩存中的數據從中獲得的

          好處相當,壞處益處相抵消。此時緩存的意義也不大。





            4、非關鍵數據(不是財務數據等)



            財務數據等是非常重要的數據,絕對不允許出現或使用無效的數據,所以此時為了安全起見最好不要

          使用二級緩存。

            因為此時 “正確性”的重要性遠遠大于 “高性能”的重要性。



          2.     目前系統中使用hibernate緩存的建議
          1.4.   目前情況
          一般系統中有三種情況會繞開hibernate執行數據庫操作:

          1、多個應用系統同時訪問一個數據庫

             此種情況使用hibernate二級緩存會不可避免的造成數據不一致的問題,

             此時要進行詳細的設計。比如在設計上避免對同一數據表的同時的寫入操作,

             使用數據庫各種級別的鎖定機制等。



          2、動態表相關

             所謂“動態表”是指在系統運行時根據用戶的操作系統自動建立的數據表。

             比如“自定義表單”等屬于用戶自定義擴展開發性質的功能模塊,因為此時數據表是運行時建立的,

          所以不能進行hibernate的映射。因此對它的操作只能是繞開hibernate的直接數據庫JDBC操作。

                如果此時動態表中的數據沒有設計緩存,就不存在數據不一致的問題。

          posted on 2009-04-11 10:24 lanxin1020 閱讀(513) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 日照市| 珠海市| 浏阳市| 诏安县| 綦江县| 八宿县| 沙河市| 刚察县| 荃湾区| 塘沽区| 革吉县| 宿州市| 长泰县| 万全县| 杭锦旗| 阿拉善左旗| 响水县| 库车县| 闵行区| 新兴县| 石狮市| 兴宁市| 洱源县| 鄂伦春自治旗| 宁城县| 茌平县| 始兴县| 万州区| 会泽县| 留坝县| 吴旗县| 昭通市| 江达县| 儋州市| 隆回县| 文成县| 永靖县| 南丹县| 方正县| 安宁市| 邳州市|