rewriteBatchedStatements=true是一个配置选项,它影响MySQL JDBC驱动程序的行为。JDBC是Java数据库连接的标准。当你使用Java程序连接MySQL数据库时,你需要使用这个驱动程序。
rewriteBatchedStatements=true的意思是,当你在Java程序中使用批量插入(batching)时,MySQL JDBC驱动程序将尝试重新编写(rewrite)你的SQL语句,以便更有效地执行这些批量插入操作。
例如,假设你执行以下批量插入操作:
connection.addBatch("INSERT INTO table VALUES (1, 'a')");
connection.addBatch("INSERT INTO table VALUES (2, 'b')");
connection.addBatch("INSERT INTO table VALUES (3, 'c')");
connection.executeBatch();
当rewriteBatchedStatements=true时,MySQL JDBC驱动程序将把你的SQL语句重新写成一个单一的批量插入语句,像这样:
INSERT INTO table (col1, col2) VALUES (1, 'a'), (2, 'b'), (3, 'c')
这样做的好处是,你可以减少与数据库的通信次数,从而提高批量插入操作的性能。因为每次通信都会产生一些开销,所以通过将多个插入操作合并成一个单一的插入语句,你可以减少这些通信次数,从而提高性能。
INSERT INTO 表名 (字段1, 字段2, 字段3, ..., 字段100)
VALUES
(值1, 值2, 值3, ..., 值100),
(值11, 值12, 值13, ..., 值200),
...
(值55, 值992, 值993, ..., 值1000);
INSERT INTO 表名 (字段1, 字段2, 字段3, ..., 字段100)
VALUES
(值1, 值2, 值3, ..., 值100),
(值11, 值12, 值13, ..., 值200),
...
(值55, 值992, 值993, ..., 值1000);
INSERT INTO 表名 (字段1, 字段2, 字段3, ..., 字段100)
VALUES
(值1, 值2, 值3, ..., 值100),
(值11, 值12, 值13, ..., 值200),
...
(值55, 值992, 值993, ..., 值1000);
INSERT INTO 表名 (字段1, 字段2, 字段3, ..., 字段100)
VALUES
(值1, 值2, 值3, ..., 值100),
(值11, 值12, 值13, ..., 值200),
...
(值55, 值992, 值993, ..., 值1000);
...
jdbcTemplate.batchUpdate(lines.toArray(new String[lines.size()]));
当我向lines添加数据超过5条是,就会报异常You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';INSERT INTO;降低到5个后就不报异常
不再使用rewriteBatchedStatements属性,然后向lines添加多条,最后批量执行,我是添加了10000条,效率挺高。
不过具体原因还没有研究清楚。