Hibernate批量插入大量數據速度性能慢的解決方案

                            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(10); //設置參數
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 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章