使用批量插入1W条数据发现很慢, 于是在Mysql中使用 set GLOBAL general_log = 0;
打开了日志, 看到每次插入都是一个独立的SQL, 并没有做插入合并.
而在Nutz的代码中是有使用批量的
// 恩,批
else {
for (Object[] params : paramMatrix) {
for (int i = 0; i < params.length; i++) {
adaptors[i].set(pstat, params[i], i + 1);
}
pstat.addBatch();// 需要配置一下batchSize,嘻嘻,不然分分钟爆内存!!
}
那么最后的问题只可能是Mysql 的JDBC的问题了, 查看MySQL JDBC源码发现有一个变量可以配置MySQL JDBC是否需要重写SQL rewriteBatchedStatements
, 配置好之后就可以看到最后的SQL是批量插入的SQL了
try {
statementBegins();
clearWarnings();
if (!this.batchHasPlainStatements && this.connection.getRewriteBatchedStatements()) {
if (canRewriteAsMultiValueInsertAtSqlLevel()) {
return executeBatchedInserts(batchTimeout);
}
if (this.connection.versionMeetsMinimum(4, 1, 0) && !this.batchHasPlainStatements && this.batchedArgs != null
&& this.batchedArgs.size() > 3 /* cost of option setting rt-wise */) {
return executePreparedBatchAsMultiStatement(batchTimeout);
}
}
return executeBatchSerially(batchTimeout);
参考:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html