6.3 Hibernate的批量處理: (6.3.1)批量插入

來源:互聯網
上載者:User

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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.