Hibernate效能最佳化策略(二)

來源:互聯網
上載者:User

緩衝機制
緩衝是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的運行效能。緩衝內的資料是對物理資料來源中資料的複製,應用程式在運行時從緩衝讀寫資料,在特定的時刻或事件會同步緩衝和物理資料來源的資料。
Hibernate的緩衝包括Session的緩衝和SessionFactory的緩衝,成為第一級緩衝和二級緩衝,這兩級緩衝都位於持久化層,存放的都是資料庫資料的拷貝。
一級緩衝
一級緩衝生命週期很短和session的生命週期一致,一級緩衝也叫session級的緩衝或事務級緩衝,在同一個Session中,它緩衝的是實體物件,支援一級緩衝的方法有load/get/iterate和save(同一個Session中先save後load不會發sql),但一級緩衝是不會緩衝普通屬性的。
在一級緩衝中進行大批量資料添加時,要注意緩衝溢出的情況,每添加數條資料要及時清理緩衝,範例程式碼如下:
[java] view plaincopy
/**
* 大批量的資料添加
*/
public void testCache7() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
for (int i=0; i<100; i++) {
Student student = new Student();
student.setName("張三" + i);
session.save(student);
//每20條更新一次
if (i % 20 == 0) {
session.flush();
//清除緩衝的內容
session.clear();
}
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
二級緩衝
二級緩衝也稱為進程級的緩衝或SessionFactory級的緩衝,二級緩衝可以被所有的session共用,二級緩衝的生命週期和SessionFactory的生命週期一致,SessionFactory可以管理二級緩衝,二級緩衝一般使用第三方的緩衝產品,Hibernate文檔推薦了幾種:Hashtable(Hibernate內部,只做測試用)、EHCache、OSCache、SwarmCache、JBossTreeCache。
以EHCache為例,二級緩衝的的配置和使用:
1. 將ehcache.xml檔案拷貝到src下;
2. 在hibernate.cfg.xml檔案中加入緩衝產品供應商<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>;
3. 啟用二級緩衝,這也是它的預設配置<propertyname="hibernate.cache.use_second_level_cache">true</property>;
4. 指定哪些實體類使用二級緩衝
可以在對應檔中採用<cache>標籤指定或在hibernate.cfg.xml檔案中統一指定,注意使用的策略,通常採用read-only和read-write;
緩衝原則:通常讀遠遠大於寫的資料進行緩衝。
一級緩衝和二級緩衝的互動中,可以通過一級緩衝中的方法session.setCacheMode(CacheMode.IGNORE)禁止資料放到二級緩衝中。在講一級緩衝大批量資料添加時,為了防止緩衝溢出要隨時清理一級緩衝,但是如果配置了二級緩衝,如果不禁止二級緩衝,同樣會引發緩衝溢出而出錯,因此需要禁止一級緩衝和二級緩衝的互動。
查詢快取
查詢快取是緩衝普通屬性結果集,可以對實體物件的結果集緩衝id,查詢快取的生命週期,當關聯的表發生修改,查詢快取的生命週期結束,查詢快取和session的生命週期是無關的,可以跨Session。查詢快取只對query.list()起作用,query.iterate()查詢普通屬性不會使用查詢快取。
查詢快取的配置和使用:
1. 修改hibernate.cfg.xml檔案,來開啟查詢快取,預設是false是不起用的<propertyname="hibernate.cache.use_query_cache">true</property>
2. 必須在程式啟用 query.setCacheable(true)
鎖機制
其實,把鎖寫進Hibernate最佳化裡是有些問題的,本身加鎖是對效能極大的損耗,但鑒於有些時候我們不得不出於解決並發性問題而考慮加鎖時,就產生了效能最佳化方面的思考,在此我們可以選擇悲觀鎖和樂觀鎖,二者對效能的影響是不同的,因此合理選鎖也會提升Hibernate的效能。
悲觀鎖
悲觀鎖,通常是由資料庫機制實現的,在整個過程中把資料鎖住(查詢時),只要事務不釋放(提交/復原),那麼任何使用者都不能查看或修改。
只需在load方法中加入第三個參數LockMode.UPGRADE即可。還有:
LockMode.NONE:無鎖機制。
LockMode.WRITE:Hibernate在Insert和Update記錄的時候會自動擷取。
LockMode.READ:Hibernate在讀取記錄的時候會自動擷取。
以上這三種鎖機制一般由Hibernate內部使用,如Hibernate為了保證Update過程中對象不會被外界修改,會在save方法實現中自動為目標對象加上WRITE鎖。
LockMode.UPGRADE:利用資料庫的forupdate子句加鎖。
LockMode.UPGRADE_NOWAIT:Oracle的特定實現,利用Oracle的for update nowait子句實現加鎖。
樂觀鎖
樂觀鎖,大多數的使用是採用資料版本的方式(version)實現,一般在資料庫中加入一個version欄位,在讀取資料的時候將version讀取出來,在儲存資料的時候判斷version的值是否小於資料庫中的version值,如果小於不予更新,否則給予更新。
Hibernate中在class標籤中通過屬性optimistic-lock=”version”來描述,optimistic-lock屬性可選取值:
none:無樂觀鎖。
version:通過版本機制實現樂觀鎖。
dirty:通過檢查發生變動過的屬性實現樂觀鎖。
all:通過檢查所有屬性實現樂觀鎖。
其中通過version實現的樂觀鎖機制是Hibernate官方推薦的樂觀鎖實現,同時也是Hibernate中,目前唯一在資料對象脫離Session發生修改的情況下依然有效

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.