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 }

 

你可能感兴趣的:(java框架,sql)