<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0

    查詢緩存

    ?????? 查詢緩存是專門針對(duì)各種查詢操作進(jìn)行緩存。查詢緩存會(huì)在整個(gè)SessionFactory的生命周期中起作用,存儲(chǔ)的方式也是采用key-value的形式來(lái)進(jìn)行存儲(chǔ)的。

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

    ?????? 在使用查詢緩存時(shí),除了需要設(shè)置hibernate.cache.provider_class參數(shù)來(lái)啟動(dòng)二級(jí)緩存外,還需要通過(guò)hibernate.cache.use_query_cache參數(shù)來(lái)啟動(dòng)對(duì)查詢緩存的支持。

    ?????? 另外需要注意的是,查詢緩存是在執(zhí)行查詢語(yǔ)句的時(shí)候指定緩存的方式以及是否需要對(duì)查詢的結(jié)果進(jìn)行緩存。

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

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

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

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

    ?????? Hibernate配置文件的詳細(xì)內(nèi)容請(qǐng)參考配套光盤(pán)中的hibernate\src\cn\hxex\ hibernate\cache\hibernate.cfg.xml文件。

    ?????? 編寫(xiě)主測(cè)試程序

    ?????? 由于這是在前面二級(jí)緩存例子的基礎(chǔ)上來(lái)開(kāi)發(fā)的,所以,對(duì)于EHCache的配置以及視圖對(duì)象的開(kāi)發(fā)和映射文件的配置工作就都不需要再重新進(jìn)行了。下面就來(lái)看一下主測(cè)試程序的實(shí)現(xiàn)方法,如清單14.11所示。

    ?????? 清單14.11??? 主程序的實(shí)現(xiàn)

    ……

    ??? 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();

    ?????? }

    }

    ?????? 主程序在實(shí)現(xiàn)的時(shí)候采用了多線程的方式來(lái)運(yùn)行。首先將“from User”查詢結(jié)果進(jìn)行緩存,然后再通過(guò)ID取得對(duì)象來(lái)檢查是否對(duì)對(duì)象進(jìn)行了緩存。另外,多個(gè)線程的執(zhí)行可以看出對(duì)于進(jìn)行了緩存的查詢是不會(huì)執(zhí)行第二次的。

    ?????? 運(yùn)行測(cè)試主程序

    ?????? 接著就來(lái)運(yùn)行測(cè)試主程序,其輸出結(jié)果應(yīng)該如下所示:

    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

    ?????? 通過(guò)上面的執(zhí)行結(jié)果可以看到,在兩個(gè)線程執(zhí)行中,只執(zhí)行了一個(gè)SQL查詢語(yǔ)句。這是因?yàn)楦鶕?jù)ID所要獲取的對(duì)象在前面的查詢中已經(jīng)得到了,并進(jìn)行了緩存,所以沒(méi)有再次執(zhí)行查詢語(yǔ)句。

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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 好男人www免费高清视频在线| 在线免费观看国产| 暖暖免费中文在线日本| a级毛片免费高清视频| 久久国产精品一区免费下载| 100部毛片免费全部播放完整| 日韩免费一区二区三区| 又粗又硬免费毛片| 亚洲美女一区二区三区| 亚洲精品人成网线在线播放va| 美女被暴羞羞免费视频| 亚洲免费视频播放| 中文字幕专区在线亚洲| 久久亚洲精品成人综合| 亚洲aⅴ天堂av天堂无码麻豆| 国产一二三四区乱码免费| 国产卡一卡二卡三免费入口| 亚洲综合最新无码专区| 国产99在线|亚洲| 免费人成在线观看视频高潮| 永久免费AV无码网站在线观看| 亚洲精品无码Av人在线观看国产| 亚洲一卡2卡4卡5卡6卡在线99 | 久久免费区一区二区三波多野| 亚洲国产精品乱码一区二区| 精品女同一区二区三区免费播放 | 毛片视频免费观看| 久久亚洲AV成人无码国产电影| 国产三级免费电影| 亚洲欧美日本韩国| 91黑丝国产线观看免费| 亚洲AV无码乱码国产麻豆| 一级做a爰片久久毛片免费看 | 最近2019中文字幕免费看最新| 久久久久亚洲AV片无码下载蜜桃 | 久久国产精品免费专区| 亚洲一日韩欧美中文字幕在线| 国产91色综合久久免费| 亚洲国产区男人本色| 亚洲av永久无码制服河南实里| 中文毛片无遮挡高潮免费|