今天写导入数据涉及到批量插入的地方使用mybatisPlus saveBatch,结果执行的时候大于sql语句发现是一条一条插入的。
查阅资料发现
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效
解决方法就是jdbc连接后面添加参数rewriteBatchedStatements=true
另外使用jdbc batch效率比mybatisPlus效率要高一点
@Resource
SqlSessionFactory sqlSessionFactory;
@Test
public void insertC() {
SqlSession sqlsession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
NotifyRecordDao notifyRecordDao = sqlsession.getMapper(NotifyRecordDao.class);
int num = 0;
for (int i = 0; i < 10000; i++) {
NotifyRecordEntity record = new NotifyRecordEntity();
record.setLastNotifyTime(new Date());
record.setPartnerNo("1");
record.setLimitNotifyTimes(1);
record.setNotifyUrl("1");
record.setLoanNo("1");
record.setNotifyContent("1");
record.setTradeNo("s" + i);
record.setNotifyTimes(1);
record.setNotifyType(EnumNotifyType.DAIFU);
record.setNotifyStatus(EnumNotifyStatus.FAIL);
notifyRecordDao.insert(record);
num++;
if(num>=1000){
sqlsession.commit();
sqlsession.clearCache();
num=0;
}
}
long start = System.currentTimeMillis();
sqlsession.commit();
sqlsession.clearCache();
sqlsession.close();
System.out.println(System.currentTimeMillis() - start);
}