隨筆-124  評論-49  文章-56  trackbacks-0
          一級緩存

            * 一級緩存是緩存實體對象的
            * 如果管理一級緩存
              一級緩存無法取消,但可以管理clear(),evict()
            * 一級緩存和session的生命周期一致,一級緩存也叫session級的緩存或事務級緩存
            * 如何避免一次性大量的實體數據入庫導至內存溢出
              先flush,再clear
            * 如何管理一級緩存
              load,get,iterate,save都支持一級緩存
          如果數據量特別大,考慮采用jdbc實現,如查jdbc也不能滿足要求可以考慮采用數據本身的特定導入工具
          Student student=(Student)session.load(Student.class,1);
          System.out.println(
          "studnet.name="+student.getName());
          //不會發出sql,因為load使用緩存
          Student student=(Student)session.load(Student.class,1);
          System.out.println(
          "studnet.name="+student.getName());

          二級緩存

            * 二級緩存是緩存實體對象的,普通屬性不會緩存
            * 二級緩存是進程級的緩存,也稱為SessionFactory級的緩存,可以被所有的session共享
              二級緩存的生命周期和SessionFactory是一致的,可以用SessionFactory管理二級緩存
            * 二級緩存的配置和使用
              1 加入ehcache的jar包;
              2 拷貝ehcache.xml文件到src目錄下;
              3 開啟二級緩存,默認是打開的。配置hibernate.cfg.xml
              hibernate.cfg.xml文件
              開啟二級緩存
          <property name="hibernate.cache.use_second_level_cache">true</property>
              指定緩存產品提供商
          <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
              4 指定那些對象使用二級緩存(兩種方運河)
                * 在映射文件中采用<cache>標簽
           
          <class name="com.my.hibernate.User" table="t_user">
                  
          <cache usage="read-only"/>
               
          <id name="id">
                
          <generator class="native"/>
               
          </id>
               
          <property name="name"/>
               
          <many-to-one name="group" column="groupid" cascade="save-update"/>
              
          </class>
              * 在hibernate.cfg.xml文件中,采用<class-cache/>標簽
          <class-cache class="com.bjsxt.hibernate.Studnet" usage="read-only"/>

          管理二級緩存

          factory.evict(Student.class);
          factory.evict(Student.class,1);

          一級緩存和二級緩存的交互問題
             1 不設置(默認)會寫入二級緩存,也會讀出
             2 GET只讀而不寫入二級緩存

             session.setCacheMode(CacheMode.GET);
             Student student
          =(Student)session.load(Student.class,1);

             3 PUT只寫入二級緩存頁不讀取

             session.setCacheMode(CacheMode.PUT);
             Student student
          =(Student)session.load(Student.class,1);


          查詢緩存

          查詢緩存是針對普通屬性結果集的緩存
          對實體對象的結果只緩存id

          查詢緩存的生命周期,當前關聯的表發生修改,那么查詢緩存生命周期結束

          查詢緩存的配置和使用
          1 起用查詢緩存
            * 配置hibernate.cfg.xml文件

          <property name="hibernate.cache.use_second_level_cache">true</property>

            * 在程序中顯式起用

          query.setCacheable(true);

          2 Session和查詢緩存生命周期沒有關系
          3 查詢緩存對query.iterate()不起作用,只用對query.list()起作用

          posted on 2009-11-03 16:49 junly 閱讀(342) 評論(0)  編輯  收藏 所屬分類: hibernate/orm
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          other

          文章

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西丰县| 体育| 迁西县| 新蔡县| 濉溪县| 汨罗市| 运城市| 贵州省| 柯坪县| 东宁县| 石棉县| 安龙县| 崇文区| 军事| 文成县| 漳平市| 南丹县| 三原县| 施甸县| 连州市| 苍山县| 南康市| 温宿县| 治县。| 祁东县| 合肥市| 高碑店市| 沙洋县| 米易县| 衡东县| 连江县| 长泰县| 巴彦县| 阳泉市| 洛隆县| 龙口市| 高碑店市| 商南县| 航空| 东莞市| 福建省|