posts - 495,  comments - 11,  trackbacks - 0

          查詢緩存

          ?????? 查詢緩存是專門針對各種查詢操作進行緩存。查詢緩存會在整個SessionFactory的生命周期中起作用,存儲的方式也是采用key-value的形式來進行存儲的。

          ?????? 查詢緩存中的key是根據查詢的語句、查詢的條件、查詢的參數和查詢的頁數等信息組成的。而數據的存儲則會使用兩種方式,使用SELECT語句只查詢實體對象的某些列或者某些實體對象列的組合時,會直接緩存整個結果集。而對于查詢結果為某個實體對象集合的情況則只會緩存實體對象的ID值,以達到緩存空間可以共用,節省空間的目的。

          ?????? 在使用查詢緩存時,除了需要設置hibernate.cache.provider_class參數來啟動二級緩存外,還需要通過hibernate.cache.use_query_cache參數來啟動對查詢緩存的支持。

          ?????? 另外需要注意的是,查詢緩存是在執行查詢語句的時候指定緩存的方式以及是否需要對查詢的結果進行緩存。

          ?????? 下面就來了解一下查詢緩存的使用方法及作用。

          ?????? 修改Hibernate配置文件

          ?????? 首先需要修改Hibernate的配置文件,增加hibernate.cache.use_query_cache參數的配置。配置方法如下:

          ?????? <property name="hibernate.cache.use_query_cache">true</property>

          ?????? Hibernate配置文件的詳細內容請參考配套光盤中的hibernate\src\cn\hxex\ hibernate\cache\hibernate.cfg.xml文件。

          ?????? 編寫主測試程序

          ?????? 由于這是在前面二級緩存例子的基礎上來開發的,所以,對于EHCache的配置以及視圖對象的開發和映射文件的配置工作就都不需要再重新進行了。下面就來看一下主測試程序的實現方法,如清單14.11所示。

          ?????? 清單14.11??? 主程序的實現

          ……

          ??? public void run() {

          ??? ?????? SessionFactory sf = QueryCacheMain.getSessionFactory();

          ??? ?????? Session session = sf.getCurrentSession();

          ??? ?????? session.beginTransaction();

          ??? ?????? Query query = session.createQuery( "from User" );

          ??? ?????? Iterator it = query.setCacheable( true ).list().iterator();

          ??? ?????? while( it.hasNext() ) {

          ??? ????????????? System.out.println( it.next() );

          ??? ?????? }

          ??? ?????? User user = (User)session.get( User.class, "1" );

          ??? ?????? System.out.println( user );

          ??? ?????? session.getTransaction().commit();

          ??? }

          ?????? public static void main(String[] args) {

          ????????????? QueryCacheMain main1 = new QueryCacheMain();

          ????????????? main1.start();

          ????????????? try {

          ???????????????????? Thread.sleep( 2000 );

          ????????????? } catch (InterruptedException e) {

          ???????????????????? e.printStackTrace();

          ????????????? }

          ????????????? QueryCacheMain main2 = new QueryCacheMain();

          ????????????? main2.start();

          ?????? }

          }

          ?????? 主程序在實現的時候采用了多線程的方式來運行。首先將“from User”查詢結果進行緩存,然后再通過ID取得對象來檢查是否對對象進行了緩存。另外,多個線程的執行可以看出對于進行了緩存的查詢是不會執行第二次的。

          ?????? 運行測試主程序

          ?????? 接著就來運行測試主程序,其輸出結果應該如下所示:

          Hibernate: select user0_.userId as userId0_, user0_.name as name0_, user0_.age as age0_ from USERINFO user0_

          ID: 1

          Namge:?? galaxy

          Age:?????? 32

          ID: 1

          Namge:?? galaxy

          Age:?????? 32

          ID: 1

          Namge:?? galaxy

          Age:?????? 32

          ID: 1

          Namge:?? galaxy

          Age:?????? 32

          ?????? 通過上面的執行結果可以看到,在兩個線程執行中,只執行了一個SQL查詢語句。這是因為根據ID所要獲取的對象在前面的查詢中已經得到了,并進行了緩存,所以沒有再次執行查詢語句。

          posted on 2009-07-19 21:25 jadmin 閱讀(67) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 枞阳县| 鄯善县| 镇原县| 巴林左旗| 大兴区| 崇州市| 五大连池市| 泰来县| 龙游县| 卓尼县| 桦川县| 成武县| 会同县| 于都县| 茶陵县| 南召县| 枞阳县| 张家口市| 宣化县| 墨脱县| 大埔县| 铁岭市| 裕民县| 项城市| 云和县| 益阳市| 朝阳区| 宾阳县| 交口县| 祁阳县| 东乡族自治县| 封开县| 新宾| 临汾市| 富源县| 赤城县| 永吉县| 峡江县| 临沂市| 湘潭市| 福建省|