java,如何处理大批量数据插入

由于做公司业务,由于数据量太大,一条条插入数据非常缓慢。(记得是插入60w单表数据,就要半个多小时,处理完后只需要几秒了)

后来,自己操作的是通过拼接sql语句,比如

insert into persons  (name , age) values ("a", 12),("b",13),("c",14)...

这样确实提高了不少效率,比如for循环个几百次然后去执行一次sql语句。(这里sql语句不能过长,否者会内存溢出)

这样可以分批处理,不需要插入一条数据,提交一次事务。

当然,还可以更简便,比如通过事务来批量提交

 

1.先设置为手动提交事务,不自动提交。

 conn.setAutoCommit(false);
2.每次循环,在语句对象调用addBatch方法,添加到批处理里面,应该是内部帮忙进行了sql拼接
preparedStatement.addBatch(); 

3.循环结束后,去批量执行executeBatch方法。

 preparedStatement.executeBatch();

4.然后此处在去手动commit
conn.commit();

 

为了进一步提高效率,还可以使用多线程去插入,这样在插入一批数据的时候,另一批就不需要进行等待。

 

多线程分为并行和并发。(比如是100w条数据)

1,并行的话,可以用for循环把总数据,平均切割为n份(和线程数相同,比如这里用10个线程,不能太多),然后每次把这其中一份数据放到一个线程处理,每个线程处理的数据互不相关,无需考虑并发。

2.并发的话,直接把总的数据集合作为全局变量,然后同时开启十个线程去同时操作这个对象,此时需要考虑并发(对象锁机制)。

 

但是个人感觉,第一种方法更好,完全可以实现就切割好数据分配给对应线程去处理,没必要再去用并发操作,这样效率应该会比较低。但是还未测试。。。

有理解不对的地方,或者有更好的方案的同学可以评论交流。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值