批量處理資料是指處理大量資料的一個單獨的事務.
在應用層批處理操作, 主要有以下方式:
通過 Session
通過 HQL
通過 StatelessSession
通過 JDBC API(僅僅要會用這樣的,其它作為了解)
通過 Session 來進行批量操作
Session 的 save() 及 update() 方法都會把處理的對象存放在自己的緩存中. 假設通過一個 Session 對象來處理大量持久化對象, 應該及時從緩存中清空已經處理完成而且不會再訪問的對象. 詳細的做法是在處理完一個對象或小批量對象後, 馬上調用 flush() 方法重新整理緩存, 然後在調用 clear() 方法清空緩存

通過 Session 來進行處理操作會受到下面限制
須要在 Hibernate 配置檔案裡設定 JDBC 單次批量處理的數目, 應保證每次向資料庫發送的批量的 SQL 語句數目與 batch_size 屬性一緻
若對象採用 “identity” 辨別符生成器, 則 Hibernate 無法在 JDBC 層進行批量插入操作
進行批量操作時, 建議關閉 Hibernate 的二級緩存
批量更新: 在進行批量更新時, 假設一下子把全部對象都載入到 Session 緩存, 然後在緩存中一一更新, 顯然是不可取的
使用可滾動的結果集 org.hibernate.ScrollableResults, 該對象中實際上并不包括不論什麼對象, 僅僅包括用于線上定位記錄的遊标. 僅僅有當程式周遊訪問 ScrollableResults 對象的特定元素時, 它才會到資料庫中載入對應的對象.
org.hibernate.ScrollableResults 對象由 Query 的 scroll 方法傳回
通過 HQL 來進行批量操作
注意: HQL 僅僅支援 INSERT INTO … SELECT 形式的插入語句, 但不支援 INSERT INTO … VALUES 形式的插入語句. 是以使用 HQL 不能進行批量插入操作.
通過StatelessSession來進行批量操作
從形式上看。StatelessSession與session的使用方法類似。StatelessSession與session相比,有下面差别:
StatelessSession沒有緩存。通過StatelessSession來載入、儲存或更新後的對象處于遊離狀态。
StatelessSession不會與Hibernate的第二級緩存互動。
當調用StatelessSession的save()、update()或delete()方法時,這些方法會馬上運作對應的SQL語句,而不會僅計劃運作一條SQL語句
StatelessSession不會進行髒檢查,是以改動了Customer對象屬性後。還須要調用StatelessSession的update()方法來更新資料庫中資料。
StatelessSession不會對關聯的對象進行不論什麼級聯操作。
通過同一個StatelessSession對象兩次載入OID為1的Customer對象。得到的兩個對象記憶體位址不同。
StatelessSession所做的操作能夠被Interceptor攔截器捕獲到,可是會被Hibernate的事件處理系統忽略掉。
本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5036975.html,如需轉載請自行聯系原作者