java服务,一次性插入20万条数据,需要放一个事务,比较通用的写法是怎样的? 项目中使用了mybatis-plus
时间: 2024-09-18 08:04:21 浏览: 40
在Java项目中,尤其是使用MyBatis Plus处理大量数据插入的情况,为了保证数据的一致性和完整性,通常会采用批量插入并设置一个数据库事务。这里是一个通用的写法:
1. 首先,你需要创建一个批次操作的对象,如`BatchInsertHelper`,这是MyBatis Plus提供的工具类,用于批量插入。
```java
import com.baomidou.mybatisplus.core.toolkit.BatchInsertHelper;
```
2. 创建一个实体集合,将20万条数据实例化成List。
```java
List<MyEntity> dataList = new ArrayList<>();
for (int i = 0; i < 200000; i++) {
MyEntity entity = new MyEntity();
// 设置实体属性...
dataList.add(entity);
}
```
3. 使用`BatchInsertHelper`开始事务,并设置批量插入的最大数量。默认情况下,MyBatis Plus的`insert()`方法已经支持批量插入,但如果性能需求更高,可以设置更大的批量值(注意,MySQL有最大行数限制,默认5000)。
```java
BatchInsertHelper batchInsertHelper = new BatchInsertHelper(MyMapper.class);
batchInsertHelper.insert(dataList, 5000); // 批量插入大小,根据实际调整
// 开始事务
try (Transaction transaction = sqlSession.startTransaction()) {
// 执行批量插入
batchInsertHelper.execute(sqlSession);
// 提交事务
transaction.commit();
} catch (Exception e) {
// 如果发生异常,则回滚事务
transaction.rollback();
logger.error("Insert data failed", e);
}
```
4. 请注意,如果内存不足以一次性加载所有的数据,可以考虑分批处理,但这样可能会增加网络IO次数。另外,频繁的事务提交可能会对数据库性能造成影响,所以最好只在数据插入完成后提交。
阅读全文