posts - 2,  comments - 0,  trackbacks - 0

          網上很多言論都說load會使用二級緩存而get不會,包括一些hibernate的教材上也這么寫的,但是以前在測試中發現,其實get也會使用二級緩存。
          很久以前就發現了這個問題,一直沒騰出時間研究,今天特意看了下源碼(3.2.6.ga),確實如此

          先看一下Session的默認實現SessionImpl
          get方法會轉到fireLoad,loadType的值是LoadEventListener.GET
          load方法也是轉到fireLoad,不同的是loadType的值是LoadEventListener.LOAD

          1. private void fireLoad(LoadEvent event, LoadType loadType) {  
          2.     errorIfClosed();  
          3.     checkTransactionSynchStatus();  
          4.     LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();  
          5.     for ( int i = 0; i < loadEventListener.length; i++ ) {  
          6.         loadEventListener[i].onLoad(event, loadType);  
          7.     }  
          8. }  

           調用loadEventListener的onLoad方法
          LoadEventListener的默認實現DefaultLoadEventListener中
          最終會轉到doLoad方法,options就是前面的loadType

          1. protected Object doLoad(  
          2.             final LoadEvent event,  
          3.             final EntityPersister persister,  
          4.             final EntityKey keyToLoad,  
          5.             final LoadEventListener.LoadType options) throws HibernateException {  
          6.     。。。。。。  
          7.     Object entity = loadFromSessionCache( event, keyToLoad, options );//從一級緩存加載  
          8.     //如果不為空,直接返回  
          9.     。。。。。。  
          10.     entity = loadFromSecondLevelCache(event, persister, options);//從二級緩存加載  
          11.     。。。。。。  
          12. }  

           loadFromSecondLevelCache即是從二級緩存中查找對象
          get和load的區別在于LoadEventListener.LoadType options參數,一個是LoadEventListener.GET,一個是LoadEventListener.LOAD
          而在這個方法中,并沒有用到options參數
          也就是說get和load使用二級緩存的狀況是一樣的,get也會使用二級緩存

           

          原文來自:http://snz.iteye.com/blog/305634

           

          posted on 2012-02-28 12:37 wilsonyq 閱讀(249) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 梁山县| 西乌珠穆沁旗| 盐亭县| 常州市| 吕梁市| 皮山县| 洛扎县| 安达市| 泗阳县| 黎平县| 三原县| 宁强县| 桐梓县| 临泽县| 承德县| 灵石县| 手机| 曲沃县| 竹北市| 定日县| 宁陵县| 南陵县| 昌图县| 崇明县| 山东省| 建平县| 宜宾市| 江油市| 河间市| 祁东县| 呼图壁县| 武山县| 祁阳县| 文水县| 长乐市| 邵阳市| 青川县| 台北市| 常熟市| 新巴尔虎右旗| 定安县|