如何學好java

          如何學好java,其實很簡單,只要用心體會,慢慢積累!
          posts - 106, comments - 7, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Hibernate緩存分類

          Posted on 2011-05-10 18:03 哈希 閱讀(193) 評論(0)  編輯  收藏 所屬分類: java 常用框架
          緩存是位于應用程序與物理數據源之間,用于臨時存放復制數據的內存區域,目的是為了減少應用程序對物理數據源訪問的次數,從而提高應用程序的運行性能.
            Hibernate在查詢數據時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數據源中檢索,所以,把頻繁使用的數據加載到緩存區后,就可以大大減少應用程序對物理數據源的訪問,使得程序的運行性能明顯的提升.

           
          Hibernate緩存分類:

          Session緩存,一級緩存.

          SessionFactory的緩存分為內置緩存和外置緩存.內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據 及預定義SQL語句等),對于應用程序來說,它是只讀的.外置緩存中存放的是數據庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作為存儲介質 外,還可以選用硬盤等外部存儲設備.

          Hibernate的緩存范圍

          Hibernate的一級緩存和二級緩存都位于均位于持久層,且均用于存放數據庫數據的副本,最大的區別就是緩存的范圍各不一樣.

          緩存的范圍分為3類:

          1.事務范圍
             事務范圍的緩存只能被當前事務訪問,每個事務都有各自的緩存,緩存內的數據通常采用相互關聯的對象形式.緩存的生命周期依賴于事務的生命周期,只有當事務結束時,緩存的生命周期才會結束.事務范圍的緩存使用內存作為存儲介質,一級緩存就屬于事務范圍.
          2.應用范圍
             應用程序的緩存可以被應用范圍內的所有事務共享訪問.緩存的生命周期依賴于應用的生命周期,只有當應用結束時,緩存的生命周期才會結束.應用范圍的緩存可以使用內存或硬盤作為存儲介質,二級緩存就屬于應用范圍.
          3.集群范圍
             在集群環境中,緩存被一個機器或多個機器的進程共享,緩存中的數據被復制到集群環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致,緩存中的數據通常采用對象的松散數據形式.

            Hibernate的緩存管理

          一級緩存的管理:

            evit(Object obj)  將指定的持久化對象從一級緩存中清除,釋放對象所占用的內存資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象.
            clear()  將一級緩存中的所有持久化對象清除,釋放其占用的內存資源
            contains(Object obj) 判斷指定的對象是否存在于一級緩存中.
            flush() 刷新一級緩存區的內容,使之與數據庫數據保持同步.

            二級緩存的管理:
            
             evict(Class arg0, Serializable arg1)  將某個類的指定ID的持久化對象從二級緩存中清除,釋放對象所占用的資源.
            
          Java代碼  收藏代碼
          1. sessionFactory.evict(Customer.class, new Integer(1));  

             evict(Class arg0)  將指定類的所有持久化對象從二級緩存中清除,釋放其占用的內存資源.
            
          Java代碼  收藏代碼
          1. sessionFactory.evict(Customer.class);  

             evictCollection(String arg0)  將指定類的所有持久化對象的指定集合從二級緩存中清除,釋放其占用的內存資源.
            
          Java代碼  收藏代碼
          1. sessionFactory.evictCollection("Customer.orders");  


          Hibernate的二級緩存的配置

          首先,不是所有的數據都適合放在二級緩存中,看一下,什么樣的數據適合放在二級緩存中來?什么樣的數據不適合放在二級緩存中來?
            下面這幾種情況就不適合加載到二級緩存中:
            1.經常被修改的數據
            2.絕對不允許出現并發訪問的數據
            3.與其他應用共享的數據
            下面這己種情況合適加載到二級緩存中:
            1.數據更新頻率低
            2.允許偶爾出現并發問題的非重要數據
            3.不會被并發訪問的數據
            4.常量數據
            5.不會被第三方修改的數據

          Hibernate的二級緩存功能是靠配置二級緩存插件來實現的,Hibernate為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充當緩存插件與Hibernate之間的適配器 .

          常用的二級緩存插件
          EHCache  org.hibernate.cache.EhCacheProvider
          OSCache  org.hibernate.cache.OSCacheProvider
          SwarmCahe  org.hibernate.cache.SwarmCacheProvider
          JBossCache  org.hibernate.cache.TreeCacheProvider

          簡單介紹一下EHCache的配置
          hibernate.cfg.xml
          Xml代碼  收藏代碼
          1. <hibernate-configuration>  
          2.    <session-factory>  
          3.       <!-- 設置二級緩存插件EHCache的Provider類-->  
          4.       <property name="hibernate.cache.provider_class">  
          5.          org.hibernate.cache.EhCacheProvider  
          6.       </property>  
          7.       <!-- 啟動"查詢緩存" -->  
          8.       <property name="hibernate.cache.use_query_cache">  
          9.          true  
          10.       </property>  
          11.    </session-factory>  
          12.  </hibernate-configuration>  


          ehcache.xml

          Xml代碼  收藏代碼
          1. <ehcache>  
          2.   <!-- maxElementsInMemory為緩存對象的最大數目, eternal設置是否永遠不過期,timeToIdleSeconds對象處于空閑狀態的最多秒數,timeToLiveSeconds對象處于緩存狀態的最多秒數 -->  
          3.   <diskStore path="java.io.tmpdir"/>  
          4.     <defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>  
          5. </ehcache>  


          ****.hbm.xml

          Xml代碼  收藏代碼
          1. <?xml version="1.0" encoding='UTF-8'?>  
          2. <!DOCTYPE hibernate-mapping PUBLIC  
          3.                             "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
          4.                             "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
          5.   
          6. <hibernate-mapping>  
          7.        
          8.    <class>  
          9.        <!-- 設置該持久化類的二級緩存并發訪問策略 read-only read-write nonstrict-read-write transactional-->  
          10.        <cache usage="read-write"/>      
          11.    </class>  
          12.   
          13. </hibernate-mapping>  


          最近用上了,看看了,有什么不妥的地方,多謝指出.
          主站蜘蛛池模板: 通化县| 嵊州市| 广水市| 剑川县| 江北区| 瓦房店市| 桃园县| 宜春市| 双桥区| 灯塔市| 安义县| 铜鼓县| 南通市| 泰州市| 图片| 顺义区| 泽州县| 无极县| 囊谦县| 连州市| 蓝山县| 镇江市| 盈江县| 南安市| 彩票| 汝城县| 诸暨市| 鄂伦春自治旗| 呼玛县| 古浪县| 连平县| 密云县| 宜春市| 那坡县| 长治县| 横峰县| 自治县| 剑河县| 册亨县| 资中县| 兴山县|