2014-12-13 11 views
0

我是新來的冬眠,我有疑問,在休眠批量處理,我讀了一些教程休眠批處理他們說什麼是使用Hibernate批量處理的

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
    Employee employee = new Employee(.....); 
    session.save(employee); 

} 
tx.commit(); 
session.close(); 

Hibernate將緩存中的所有的持久化對象會話級別的緩存,最終你的應用程序會在第50000行左右出現OutOfMemoryException。你可以,如果你使用的是批量處理和Hibernate像解決此問題,

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
Employee employee = new Employee(.....); 
session.save(employee); 
if(i % 50 == 0) 
{ // Same as the JDBC batch size 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 
} 
tx.commit(); 
session.close(); 

我懷疑是不是外面初始化會話,我們爲什麼不能初始化到像循環,

Session session = null; 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
session =SessionFactory.openSession() 
Employee employee = new Employee(.....); 
session.save(employee); 
} 
tx.commit(); 
session.close(); 

這是正確的方式或沒有任何一個建議我正確的方式?

+0

被佔用的內存剛剛發現約的一篇文章[休眠時的批處理](http://onetouchcode.com/2016/08/21/batch-processing-example-in-hibernate/) – Shailendra 2016-08-27 18:27:17

回答

2

否。不要在for循環中初始化會話;每次你開始一個新的會話時,你都會開始一個新的批處理(所以你的批量大小是你的方式,也就是說它不是批處理)。另外,這將是太多你的方式。這就是爲什麼第一個例子有

if(i % 50 == 0) { 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 

這就是「沖洗一批插入和釋放內存」的原因。

+0

哦!好吧,謝謝,我另一個懷疑,如果我使用 30我可以使用if(i%50 == 0){session.flush(); session.clear();}? – 2014-12-13 06:48:33

+1

當然,但並不是最佳的。批量**應該**匹配。 – 2014-12-13 06:49:28

+0

現在我非常感謝你清除了這個概念。 – 2014-12-13 06:54:08

1

Batch Processing in Hibernate意味着將龐大數字的任務分成一些較小的任務。

當你火session.save(obj),Hibernate會自動緩存對象到其內存(仍然對象不寫入數據庫),並且將它當您提交您的交易即當你調用transactrion.commit()保存到數據庫中。假設你有數百萬條記錄要插入,所以解僱session.save(obj)會消耗大量內存,最終會導致OutOfMemoryException

解決方案: 創建一個簡單批量的較小尺寸並將其保存到數據庫。

if(i % 50 == 0) { 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 

注: 在上面的代碼session.flush()flush即實際的對象保存到數據庫,並session.clear()會清除這些對象的批量大小50