Hibernate批量插入大量數據速度性能慢的解決方案
Hibernate的緩存,Hibernate有內部緩存與二級緩存之說。由於Hibernate對這兩種緩存有着不同的管理機制,對於二級緩存,我們可以對它的大小進行相關配置,而對於內部緩存,Hibernate就採取了"放任自流"的態度了,對它的容量並沒有限制。
Hibernate先把數據放到內部緩存中再操作,這使得對於大量數據的批量操作性能上很慢。
解決方案:
1:繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的。也是最快的。
1 Transaction tx=session.beginTransaction(); //注意用的是hibernate事務處理邊界
2 Connection conn=session.connection();
3 PreparedStatement stmt=conn.preparedStatement("update CUSTOMER as C set C.sarlary=c.sarlary+1 where c.sarlary>1000");
4 stmt.excuteUpdate();
5 tx.commit();
2:運用存儲過程。(本質是繞過hibernate api)
1 tx = session.beginTransaction();
2 Connection con=session.connection();
3 String procedure = "{call batchUpdateCustomer(?) }";
4 CallableStatement cstmt = con.prepareCall(procedure);
5 cstmt.setInt(1,0); //設置參數
6 cstmt.executeUpdate();
7 tx.commit();
3:還是用Hibernate API 來進行常規的批量處理,可以也有變,變就變在,我們可以在查找出一定的量的時候,及時的將這些數據做完操作就 刪掉,session.flush();session.evict(XX對象集); 這樣也可以挽救一點性能損失。這個"一定的量"要就要根據實際情況做定量參考了。一般爲30-60左右,但效果仍然不理想。
1 tx=session.beginTransaction();
2 for(int i=0;i<100000;i++)
3 {
4 Customer custom=new Customer();
5 custom.setName("user"+i);
6 session.save(custom);// 或者session.flush();session.evict(XX對象集);
7 if(i%50==0) // 以每50個數據作爲一個處理單元
8 {
9 session.flush();
10 session.clear();
11 }
12 }