背景
定时任务拉取4000条数据, 每条数据对应一张不同的表;即4000条数据对应4000张表
方案
- 使用自定义
ExecutorType
默认情况下,MyBatis 会为每个 SQL 语句生成一个新的PreparedStatement
,这会导致大量的开销。通过将ExecutorType
设置为BATCH
,可以将多条语句合并为一个批处理,大幅减少网络交互次数。
代码
@Autowired
private SqlSessionFactory sqlSessionFactory;
public void batchInsert(List<MyData> dataList) {
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
MyMapper mapper = sqlSession.getMapper(MyMapper.class);
for (int i = 0; i < dataList.size(); i++) {
mapper.insert(dataList.get(i));
if (i % BATCH_SIZE == 0) {
sqlSession.flushStatements();
}
}
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
效果
BATCH_SIZE 设置为1000, 数据库为TDengine2.0. 5秒完成4000条数据入库;