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

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

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

    posts - 60,comments - 71,trackbacks - 0

            Cache就是緩存,它往往是提高系統性能的最重要手段,對數據起到一個蓄水池和緩沖的作用。Cache對于大量依賴數據讀取操作的系統而言尤其重要。在大并發量的情況下,如果每次程序都需要向數據庫直接做查詢操作,它們所帶來的性能開銷是顯而易見的,頻繁的網絡輿,數據庫磁盤的讀寫操作都會大大降低系統的性能。此時如果能讓數據庫在本地內存中保留一個鏡像,下次訪問的時候只需要從內存中直接獲取,那么顯然可以帶來不小的性能提升。引入Cache機制的難點是如何保證內存中數據的有效性,否則臟數據的出現將會給系統帶來難以預知的嚴重后果。雖然一個設計得很好的應用程序不用Cache也可以表現出讓人接受的性能,但毫無疑問,一些對讀取操作要求比較高的應用程序可以通過Cache獲得更高的性能。對于應用程序,Cache通過內存或磁盤保存了數據庫中的當前有關數據狀態,它是一個存儲在本地的數據備份。Cache位于數據庫和應用程序之間,從數據庫更新數據,并給程序提供數據。
    Hibernate實現了良好的Cache機制,可以借助Hibernate內部的Cache迅速提高系統的數據讀取性能。Hibernate中的Cache可分為兩層:一級Cache和二級Cache。
    一級Cache:
    Session實現了第一級Cache,它屬于事務級數據緩沖。一旦事務結束,這個Cache也隨之失效。一個Session的生命周期對應一個數據庫事務或一個程序事務。
    Session-cache保證了一個Session中兩次請求同一個對象時,取得的對象是同一個JAVA實例,有時它可以避免不必要的數據沖突。另外,它還能為另一些重要的性能提供保證:
    1:在對一個對象進行自我循環引用時, 不至于產生堆棧溢出。
    2:當數據庫事務結束時,對于同一個數據庫行,不會產生數據沖突,因為對于數據庫中的一行,最多只有一個對象來表示它。
    3:一個事務中可能會有很多個處理單元,在每一個處理單元中做的操作都會立即被另外的處理單元得知。
    我們不用刻意去打開Session-cache,它總是被打開并且不能被關閉。當使用save(),update()或saveOrUpdate()來保存數據更改,或通過load(),find(),list()等方法來得到對象時,對象就會被加入到Session-cache。
    如果要同步很多數據對象,就需要有效地管理Cache,可以用Session的evict()方法從一級Cache中移除對象。如下:
    Session session = HibernateUtil.currentSession();
    Transaction tx 
    = session.beginTransaction();
    for(int i = 0 ; i <100000 ; i++)
    {
        Student stu 
    = new Student();
        
        session.save(stu);
    }

    tx.commit();
    session.close();
    在保存50000個或更多對象時,程序可能會拋出OutOfMemoryException異常,因為Hibernate在一級Cache緩存了新加入的所有對象。內存溢出。要解決這全問題就需要把JDBC批處理數量設置為一個合理的數值(一般是10~20)。在Hibernate的配置文件中可以加入以下屬性
    <property name="hibernate.jdbc.batch_size"> 20 </property>

    然后我們在程序中一定時刻就提交并更新Session的Cache:
    Session session = HibernateUtil.currentSession();
    Transaction tx 
    = session.beginTransaction();
    for(int i = 0 ; i <100000 ; i++)
    {
        Student stu 
    = new Student();
        
        session.save(stu);
        
    if(i%20 == 0)    //每保存完20個對象后,進行如下操作
        {
            session.flush();
    //這個會提交更新
            session.clear();//清除Cache,釋放內存
        }

    }

    tx.commit();
    session.close();

    二級Cache
    二級Cache是SessionFactory范圍內的緩存,所有的Session共享同一個二級Cache。在二級Cache中保存持久性實例的散裝形式的數據。二級Cache的內部如何實現并不重要,重要的是采用哪種正確的緩存策略,以及采用哪個Cache提供器。持久化不同的數據需要不同的Cache策略,比如一些因素將影響到Cache策略的選擇:數據的讀/寫比例,數據表是否能被其他的應用程序揚訪問等。對于一些讀/寫比例高的數據可以打開它的緩存,允許這些數據進入二級緩存容器有利于系統性能的優化;而對于能被其它應用程序訪問的數據對象,最好將此對象的二級Cache選項關閉。
    設置Hibernate的二級Cache需要分兩步進行:首先確認使用什么數據并發策略,然后配置緩存過期時間并設置Cache提供器。
    有4種內置的Hibernate數據并發沖突策略,代表數據庫隔離級別,如下:
    1:事務(Transaction)僅在受管理的環境中可用。它保證可重讀的事務隔離級別,可以對讀/寫比例高,很少更新的數據采用該策略。
    2:讀寫(read-write)使用時間戳機制維護讀寫提交事務隔離級別??梢詫ψx/寫比例高,很少更新的數據采用該策略。
    3:非嚴格讀寫(notstrict-read-write)不保證Cache和數據庫之間的數據庫的一致性。使用此策略時,應該設置足夠的緩存過期時間,否則可能從緩存中讀出臟數據。當一些數據極少改變,并且當這些數據和數據庫有一部份不量影響不大時,可以使用此策略。
    4:只讀(read-only)當確保數據永不改變時,可以使用此策略。

    我們確定了Cache策略后,就要挑選一個高效的Cache提供器,它將作為插件被Hibernate調用。Hibernate允許使用下述幾種緩存插件:
    EhCache:可以在JVM中作為一個簡單進程范圍內的緩存,它可以把緩存的數據放入內存或磁盤,并支持Hibernate中可選用的查詢緩存。
    OpenSymphony OSCache:和EhCache相似,并且提供了豐富的緩存過期策略。
    SwarmCache:可作為集群范圍的緩存,但不支持查詢緩存。
    JBossCache:可作為集群范圍的緩沖,但不支持查詢緩存。

    在Hibernate中使用EhCache
    EhCache是一個純JAVA程序,可以在Hibernate中作為一個插件引入。在Hibernate中使用EhCache需要在Hibernate的配置文件中設置如下:

    <propery name="hibernate.cache.provider_class">
        org.hibernate.cache.EhCacheProvider
    </property>
    EhCacheProvider類是位于Hibernate3.jar包中而不是ehcache-1.1.jar包中。EhCache有自己的配置文檔,名為chcache.xml。Hibernate3.x中的etc目錄下有ehcache.xml的示例文件,只須要將 它COPY到我們的應用程序src目錄下(編譯時會把ehcache.xmlCOPY到WEB-INF/classes目錄下)。對其中的相關值進行更改以和自己的程序相適應。進行配置后,在ehcache.xml文件中的代碼如下:
    <ehcache>
        
    <diskStore path="c:\\cache"/>    //設置cache.data文件存放位置

        
    <defaultCache
                    
    maxElementsInMemory="10000" //緩存中允許創建的最大對象數
                    eternal
    ="false"    //緩存中對象是否為永久的
                    timeToIdleSeconds
    ="120"//緩存數據鈍化時間(即對象在它過期前的空閑時間)
                    timeToLiveSeconds
    ="120"//緩存數據生存時間(即對象在它過期前的生存時間)
                    overflowToDisk
    ="true"
        
    />
        
        
    <cache name="Student"    //用戶自定義的Cache配置
                     maxElementsInMemory
    ="10000"
                     eternal
    ="false"
                     timeToIdleSeconds
    ="300"
                     timeToLiveSeconds
    ="600"
                     overflowToDisk
    ="true"
                     
    />
    </ehcache>
    此外我們還需要在持久化類的映射文件中進行配置。例如,Group(班級)和Student(學生)是一對多的關系,它們對應的數據表分別是t_group和t_student。現在要把Student類的數據進行二級緩存,這需要在二個映射文件中都對二級緩存進行配置。
    在Group.hbm.xml中如下
    在其<set></set>中添加
    <cache usage="read-write"/><!--集合中的數據被緩存-->
    上述文件雖然在<set>標記中設置了<cache usage="read-write"/>,但Hibernate只是把Group相關的Student的主鍵ID加入到緩存中,如果希望把整個Student的散裝屬性都加入到二級緩存中,還需要在Student.hbm.xml文件的<class>標記中添加<cache>子標記。如下:
    <class name="Student" table="t_student">
        
    <cache usage="read-write" /><!--cache標記需跟在class標記后-->
    </class>
    posted on 2008-05-25 14:11 henry1451 閱讀(277) 評論(0)  編輯  收藏 所屬分類: Hibernate技術
    主站蜘蛛池模板: 草久免费在线观看网站| 国产精品亚洲一区二区三区在线观看| 一级成人生活片免费看| 好爽好紧好大的免费视频国产| 精品亚洲456在线播放| 一本无码人妻在中文字幕免费 | 久久免费99精品国产自在现线 | 亚洲精品你懂的在线观看| 伊人久久国产免费观看视频| 亚洲欧洲久久久精品| 一级毛片视频免费观看| 亚洲日韩中文无码久久| 免费观看成人久久网免费观看| 亚洲热线99精品视频| 99热精品在线免费观看| 亚洲成人福利网站| 成年人性生活免费视频| 国产亚洲精品91| 亚洲人成网站在线观看播放| 久久免费国产精品一区二区| 亚洲高清中文字幕| 全免费a级毛片免费看不卡| 香蕉97碰碰视频免费| 精品亚洲成α人无码成α在线观看| 国产精品hd免费观看| 久久精品国产精品亚洲艾草网 | 亚洲人成色77777在线观看大| 中国一级毛片视频免费看| 久久夜色精品国产噜噜噜亚洲AV| 国产免费女女脚奴视频网| 亚洲精品国产首次亮相| 国产亚洲av人片在线观看| 免费黄色福利视频| 亚洲av日韩综合一区二区三区| 亚洲精品岛国片在线观看| 99久久免费看国产精品| 美女被羞羞网站免费下载| 久久久久亚洲AV成人无码网站 | 99精品国产免费久久久久久下载| 理论亚洲区美一区二区三区 | 一区二区三区免费视频播放器 |