Hibernate完全以物件導向的方式來操作資料庫,當程式裡以物件導向的方式操作持久化對象時,將被自動轉換為對資料庫的操作。例如我們調用Session的delete( )方法來刪除持久化對象,Hibernate將負責刪除對應的資料記錄;當我們執行持久化對象的setter方法時,Hibernate將自動轉換為底層的update語句,修改資料庫的對應記錄。
現在的問題是:如果我們需要同時更新10萬條記錄,是不是要逐一載入10萬條記錄,然後依次調用setter方法------這樣不僅繁瑣,資料訪問的效能也十分糟糕。為了面對這種批量處理的情境,Hibernate提供了批量處理的解決方案。下面分別從批量插入、批次更新和大量刪除三個方面介紹如何面對這種批量處理的情形。
批量插入:
如果需要將10萬條記錄插入資料庫,通過Hibernate可能會採用如下做法:
Transaction txt=session.beginTransaction();for(int i=0;i<100000;i++){User user=new User(...);session.save(user);}txt.commit();session.close();
但隨著這個程式的運行,總會在某個時候運行失敗,並且拋出OutOfMemoryException。這是因為Hibernate的Session持有一個必選的一級緩衝,所有的User執行個體都將在Session層級的緩衝區進行緩衝的緣故。
為瞭解決這個問題,有個非常簡單的思路:定時將Session緩衝的資料刷入資料庫,而不是一直在Session層級緩衝。
Transaction txt=session.beginTransaction();for(int i=0;i<100000;i++){User user=new User(...);session.save(user);if(i%20==0){session.flush();session.clear();}}txt.commit();session.close();
上面的代碼中當i%20==0時,手動將Session處緩衝的資料寫入資料庫,並且清空Session緩衝裡的資料。除了要對Session層級緩衝進行處理外,還應該通過如下配置來關閉SessionFactory的二級緩衝:
<property name="hibernate.cache.use_second_level_cache">false</property>