springboot执行批量插入_多线程多批量插入大数据
时间: 2023-10-09 15:05:22 浏览: 111
批量插入大量数据
5星 · 资源好评率100%
SpringBoot 执行批量插入可以通过使用JdbcTemplate的batchUpdate()方法来实现。如果数据量很大,可以采用多线程和多批量插入的方式来提高插入效率。
下面是一个示例代码:
```java
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public void batchInsert(List<User> userList) throws InterruptedException {
int batchSize = 1000;
int threadCount = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
List<List<User>> splitList = ListUtils.splitList(userList, batchSize);
CountDownLatch countDownLatch = new CountDownLatch(splitList.size());
for (List<User> list : splitList) {
executorService.execute(() -> {
try {
batchInsert(list);
} finally {
countDownLatch.countDown();
}
});
}
countDownLatch.await();
executorService.shutdown();
}
private void batchInsert(List<User> userList) {
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = userList.get(i);
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
}
@Override
public int getBatchSize() {
return userList.size();
}
});
}
}
```
这个示例中,我们先将数据按照固定大小分成多个批次,然后采用多线程的方式,每个线程执行一个批次的插入操作。我们通过CountDownLatch来控制所有线程都执行完毕后再退出程序。这样可以确保所有数据都被正确地插入到数据库中。
注意,这里的ListUtils.splitList()方法是一个自定义的分割List的工具类,具体实现可以参考Guava库中的Lists.partition()方法。另外,为了简化代码,这里省略了User实体类的定义。
阅读全文