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

公司业务中数据量太大,逐条插入数据缓慢。可通过拼接 SQL 语句分批处理,还能使用事务批量提交。为进一步提高效率,可采用多线程插入,多线程分为并行和并发两种方式,作者认为并行方式更好,但未测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于做公司业务,由于数据量太大,一条条插入数据非常缓慢。(记得是插入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.并发的话,直接把总的数据集合作为全局变量,然后同时开启十个线程去同时操作这个对象,此时需要考虑并发(对象锁机制)。

 

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

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

Java中,批量插入数据通常是为了提高数据库操作的性能,特别是在处理大量数据时。这通常通过利用JDBC(Java Database Connectivity)提供的批处理(Batching)功能来实现。批处理允许一次发送多条SQL语句,而不是一条一条地发送,减少了网络往返次数,提高了效率。 以下是使用PreparedStatement进行批量插入的一般步骤: 1. **创建PreparedStatement**: 首先,创建一个PreparedStatement对象,并设置其查询语句为准备好的(PreparedStatement)。例如,如果你有一个用户表,你可以创建一个类似这样的语句: ```java String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; PreparedStatement pstmt = connection.prepareStatement(sql); ``` 2. **设置参数**: 使用`setXxx`方法多次为每个值赋值,这里`Xxx`对应参数位置(如`setString(1, name)`,`setString(2, email)`)。 ```java for (User user : usersToInsert) { pstmt.setString(1, user.getName()); pstmt.setString(2, user.getEmail()); // 添加到批次 pstmt.addBatch(); } ``` 3. **添加到批处理**: 对于每条待插入数据,调用`addBatch()`方法将其加入批处理列表。 4. **执行批处理**: 执行所有预设的插入操作: ```java pstmt.executeBatch(); // 执行批处理 ``` 5. **关闭资源**: 最后别忘了关闭`pstmt`和连接资源,释放内存和关闭数据库连接。 **注意事项**: - 调整数据库连接池大小以支持并发操作。 - 如果数据量非常大,可能会导致内存溢出,这时可以考虑分批处理或者使用数据库自身的批量导入工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值