mysql/mybatis insertBatch插入速度太慢了
比较少用mysql,最近接手一个项目,遇到一个mybatis插入速度很慢的问题,但是看代码mybatis的批量使用的是JDBC的 PrepareStatement.executeBatch,性能应该不至少太差,但是在生产环境居然只有40条/S,太慢了。搜索相关的问题,发现跟连接url的参数有问题,加上&rewriteBatchedStatements=true即可。
详细参数说明可以参考 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html
测试JDBC时候速度很快,但是到生产环境上仍然很慢,有提升但是不是很显著。于是把生产环境的数据扒下来测试,最后发现是mybatis每一条数据都是一个新的PreparedStatement,本来应该可以重用PrepareStatement的,但是因为每条数据都有不同的情况的NULL值(Mybatis不更新实体的NULL值字段),进而导致了Mybatis每次生成的insert sql语句几乎都不一样,所以每次都得生成一条新的PreparedStatement,不能真正的addBatch和executeBatch。
因此:
1、建议数据库/实体尽量不允许NULL值字段 ,这样子批量插入时候Mybatis能够重用生成的PreparedStatement,实现批量提交。
2、改成INSERT INTO t_xxx VALUES(XXX, XXX), (XXX, XXX)这样的一次提交多行的方式插入,但是此方法可能会绕过我们封装的业务代码,因此不太推荐此方法。
XMReport-最懂你的Java报表工具
XMReport-The Best Java Report Engine