由于做公司业务,由于数据量太大,一条条插入数据非常缓慢。(记得是插入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.并发的话,直接把总的数据集合作为全局变量,然后同时开启十个线程去同时操作这个对象,此时需要考虑并发(对象锁机制)。
但是个人感觉,第一种方法更好,完全可以实现就切割好数据分配给对应线程去处理,没必要再去用并发操作,这样效率应该会比较低。但是还未测试。。。
有理解不对的地方,或者有更好的方案的同学可以评论交流。