?????? 大家都知道,Hibernate是以JDBC為基礎實現的持久層組件,因而其性能肯定會低于直接使用JDBC來訪問數據庫。因此,為了提高Hibernate的性能,在Hibernate組件中提供了完善的緩存機制來提高數據庫訪問的性能。
?????? 什么是緩存
?????? 緩存是介于應用程序和物理數據之間的,其作用是為了降低應用程序對物理數據訪問的頻次從而提高應用系統的性能。緩存思想的提出主要是因為對物理數據的訪問效率要遠遠低于對內存的訪問速度,因而采用了將部分物理數據存放于內存當中,這樣可以有效地減少對物理數據的訪問次數,從而提高系統的性能。
?????? 緩存廣泛地存在于我們所接觸的各種應用系統中,例如數據庫系統、Windows操作系統等,在進行物理數據的訪問時無一例外地都使用了緩存機制來提高操作的性能。
?????? 緩存內的數據是對物理數據的復制,因此一個緩存系統所應該包括的最基本的功能是數據的緩存和讀取,同時在使用緩存的時候還要考慮緩存中的數據與物理數據的同步,也就是要保持兩者是一致的。
?????? 緩存要求對數據的讀寫速度很高,因此,一般情況下會選用內存作為存儲的介質。但如果內存有限,并且緩存中存放的數據量非常大時,也會用硬盤作為緩存介質。緩存的實現不僅僅要考慮存儲的介質,還要考慮到管理緩存的并發訪問和緩存數據的生命周期。
?????? 為了提高系統的性能,Hibernate也使用了緩存的機制。在Hibernate框架中,主要包括以下兩個方面的緩存:一級緩存和二級緩存(包含查詢緩存)。Hibernate中緩存的作用主要表現在以下兩個方面:
●?? 通過主鍵(ID)加載數據的時候
●?? 延遲加載中
一級緩存
?????? Hibernate的一級緩存是由Session提供的,因此它只存在于Session的生命周期中,也就是當Session關閉的時候該Session所管理的一級緩存也會立即被清除。
?????? Hibernate的一級緩存是Session所內置的,不能被卸載,也不能進行任何配置。
?????? 一級緩存采用的是key-value的Map方式來實現的,在緩存實體對象時,對象的主關鍵字ID是Map的key,實體對象就是對應的值。所以說,一級緩存是以實體對象為單位進行存儲的,在訪問的時候使用的是主關鍵字ID。
?????? 雖然,Hibernate對一級緩存使用的是自動維護的功能,沒有提供任何配置功能,但是可以通過Session中所提供的方法來對一級緩存的管理進行手工干預。Session中所提供的干預方法包括以下兩種。
●?? evict() :用于將某個對象從Session的一級緩存中清除。
●?? clear() :用于將一級緩存中的對象全部清除。
?????? 在進行大批量數據一次性更新的時候,會占用非常多的內存來緩存被更新的對象。這時就應該階段性地調用clear()方法來清空一級緩存中的對象,控制一級緩存的大小,以避免產生內存溢出的情況。具體的實現方法如清單14.8所示。
?????? 清單14.8??? 大批量更新時緩存的處理方法
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
??
for ( int i=0; i<100000; i++ ) {
??? Customer customer = new Customer(……);
??? session.save(customer);
??? if ( i % 20 == 0 ) {
??????? //將本批插入的對象立即寫入數據庫并釋放內存
??????? session.flush();
??????? session.clear();
??? }
}
??
tx.commit();
session.close();
posted on 2009-07-19 21:18
jadmin 閱讀(90)
評論(0) 編輯 收藏