查詢緩存(一)

1.查詢緩存
在使用外連接進行查詢時需要注意查詢緩存的使用
   hibernate的xml配置文件,當一對多中配置抓取策略爲join時
  
    <set inverse="true" access="field" name="childern" fetch="join" cascade="save-update,persist" >
      <key column="PID"/>
      <one-to-many class="com.going.platform.model.Organization"/>
    </set>
   
   
   String hsql=" from Organization  porg left outer join fetch porg.childern as corg ";
   List<Organization> results=super.getSession().createQuery(hsql).setCacheable(true).list();
   進行查詢時  第一次查詢會使用外連接的方式來進行查詢,查詢的sql語句
      select
        this_.ID as ID0_1_,
        this_.ORGANIZATION_NAME as ORGANIZA2_0_1_,
        this_.ORGANIZATION_SN as ORGANIZA3_0_1_,
        this_.DESCRIPTION as DESCRIPT4_0_1_,
        this_.PID as PID0_1_,
        this_.ORGANIZATION_TEL as ORGANIZA6_0_1_,
        this_.ORDER_NUM as ORDER7_0_1_,
        this_.PERSON_ID as PERSON8_0_1_,
        childern2_.PID as PID3_,
        childern2_.ID as ID3_,
        childern2_.ID as ID0_0_,
        childern2_.ORGANIZATION_NAME as ORGANIZA2_0_0_,
        childern2_.ORGANIZATION_SN as ORGANIZA3_0_0_,
        childern2_.DESCRIPTION as DESCRIPT4_0_0_,
        childern2_.PID as PID0_0_,
        childern2_.ORGANIZATION_TEL as ORGANIZA6_0_0_,
        childern2_.ORDER_NUM as ORDER7_0_0_,
        childern2_.PERSON_ID as PERSON8_0_0_
    from
        g_organization this_
    left outer join
        g_organization childern2_
            on this_.ID=childern2_.PID
           
   但配置了查詢緩存 第二次點擊時 則會產生如下sql語句
  
       select
        organizati0_.ID as ID0_1_,
        organizati0_.ORGANIZATION_NAME as ORGANIZA2_0_1_,
        organizati0_.ORGANIZATION_SN as ORGANIZA3_0_1_,
        organizati0_.DESCRIPTION as DESCRIPT4_0_1_,
        organizati0_.PID as PID0_1_,
        organizati0_.ORGANIZATION_TEL as ORGANIZA6_0_1_,
        organizati0_.ORDER_NUM as ORDER7_0_1_,
        organizati0_.PERSON_ID as PERSON8_0_1_,
        childern1_.PID as PID3_,
        childern1_.ID as ID3_,
        childern1_.ID as ID0_0_,
        childern1_.ORGANIZATION_NAME as ORGANIZA2_0_0_,
        childern1_.ORGANIZATION_SN as ORGANIZA3_0_0_,
        childern1_.DESCRIPTION as DESCRIPT4_0_0_,
        childern1_.PID as PID0_0_,
        childern1_.ORGANIZATION_TEL as ORGANIZA6_0_0_,
        childern1_.ORDER_NUM as ORDER7_0_0_,
        childern1_.PERSON_ID as PERSON8_0_0_
    from
        g_organization organizati0_
    left outer join
        g_organization childern1_
            on organizati0_.ID=childern1_.PID
    where
        organizati0_.ID=?
Hibernate:
    select
        organizati0_.ID as ID0_1_,
        organizati0_.ORGANIZATION_NAME as ORGANIZA2_0_1_,
        organizati0_.ORGANIZATION_SN as ORGANIZA3_0_1_,
        organizati0_.DESCRIPTION as DESCRIPT4_0_1_,
        organizati0_.PID as PID0_1_,
        organizati0_.ORGANIZATION_TEL as ORGANIZA6_0_1_,
        organizati0_.ORDER_NUM as ORDER7_0_1_,
        organizati0_.PERSON_ID as PERSON8_0_1_,
        childern1_.PID as PID3_,
        childern1_.ID as ID3_,
        childern1_.ID as ID0_0_,
        childern1_.ORGANIZATION_NAME as ORGANIZA2_0_0_,
        childern1_.ORGANIZATION_SN as ORGANIZA3_0_0_,
        childern1_.DESCRIPTION as DESCRIPT4_0_0_,
        childern1_.PID as PID0_0_,
        childern1_.ORGANIZATION_TEL as ORGANIZA6_0_0_,
        childern1_.ORDER_NUM as ORDER7_0_0_,
        childern1_.PERSON_ID as PERSON8_0_0_
    from
        g_organization organizati0_
    left outer join
        g_organization childern1_
            on organizati0_.ID=childern1_.PID
    where
        organizati0_.ID=?
       
        個人認爲是,hibernate中會得出擁有子節點的數據id、,然後根據Id進行外連接進行查詢
    
 但如果取消查詢緩存的話 每次都會調用同一語句  
    select
        this_.ID as ID0_1_,
        this_.ORGANIZATION_NAME as ORGANIZA2_0_1_,
        this_.ORGANIZATION_SN as ORGANIZA3_0_1_,
        this_.DESCRIPTION as DESCRIPT4_0_1_,
        this_.PID as PID0_1_,
        this_.ORGANIZATION_TEL as ORGANIZA6_0_1_,
        this_.ORDER_NUM as ORDER7_0_1_,
        this_.PERSON_ID as PERSON8_0_1_,
        childern2_.PID as PID3_,
        childern2_.ID as ID3_,
        childern2_.ID as ID0_0_,
        childern2_.ORGANIZATION_NAME as ORGANIZA2_0_0_,
        childern2_.ORGANIZATION_SN as ORGANIZA3_0_0_,
        childern2_.DESCRIPTION as DESCRIPT4_0_0_,
        childern2_.PID as PID0_0_,
        childern2_.ORGANIZATION_TEL as ORGANIZA6_0_0_,
        childern2_.ORDER_NUM as ORDER7_0_0_,
        childern2_.PERSON_ID as PERSON8_0_0_
    from
        g_organization this_
    left outer join
        g_organization childern2_
            on this_.ID=childern2_.PID
    來進行查詢。。。。
    得出結論就是在使用外連接時,應該注意到並不是所有條件不會變化的sql語句,使用查詢緩存的命中率就會高   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章