這裏介紹Hibernate Cache,Hibernate實現了良好的Cache機制,能夠藉助Hibernate內部的Cache迅速提升系統的數據讀取性能。java
AD:數據庫
Hibernate Cache有不少值得學習的地方,這裏咱們主要介紹一級Cache,包括介紹Session實現了第一級Hibernate Cache,它屬於事務級數據緩衝等方面。緩存
Hibernate實現了良好的Cache機制,能夠藉助Hibernate內部的Cache迅速提升系統的數據讀取性能。Hibernate中的Cache可分爲兩層:一級Cache和二級Cache.session
一級Cache:性能
Session實現了第一級Hibernate Cache,它屬於事務級數據緩衝。一旦事務結束,這個Cache也隨之失效。一個Session的生命週期對應一個數據庫事務或一個程序事務。學習
Session-cache保證了一個Session中兩次請求同一個對象時,取得的對象是同一個JAVA實例,有時它能夠避免沒必要要的數據衝突。另外,它還能爲另外一些重要的性能提供保證:spa
1:在對一個對象進行自我循環引用時, 不至於產生堆棧溢出。hibernate
2:當數據庫事務結束時,對於同一個數據庫行,不會產生數據衝突,由於對於數據庫中的一行,最多隻有一個對象來表示它。code
3:一個事務中可能會有不少個處理單元,在每個處理單元中作的操做都會當即被另外的處理單元得知。xml
咱們不用刻意去打開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 Cache的配置文件中能夠加入如下屬性
<property name="hibernate.jdbc.batch_size"> 20 </property>
而後咱們在程序中必定時刻就提交併更新Session的Hibernate 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,釋放內存 } }