批量插入rewriteBatchedStatements=true
今天写导入数据涉及到批量插入的地方使用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); }