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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 炎陵县| 崇仁县| 赫章县| 潜山县| 内乡县| 城固县| 上饶市| 沅陵县| 兰坪| 门头沟区| 江山市| 老河口市| 阿勒泰市| 延安市| 泾川县| 合水县| 崇文区| 平凉市| 汕头市| 海安县| 鄯善县| 建水县| 大悟县| 榆社县| 定日县| 苍南县| 嘉峪关市| 岳阳县| 崇信县| 铁岭市| 新龙县| 吉林省| 汕尾市| 山阳县| 应用必备| 象山县| 通辽市| 绍兴市| 柳河县| 义乌市| 介休市|