jdbc 使用rewriteBatchedStatements=true后,报错

jdbc 使用rewriteBatchedStatements=true后,报错了

rewriteBatchedStatements=true解释

    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')

    这样做的好处是,你可以减少与数据库的通信次数,从而提高批量插入操作的性能。因为每次通信都会产生一些开销,所以通过将多个插入操作合并成一个单一的插入语句,你可以减少这些通信次数,从而提高性能。

使用场景

需要执行的sql

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条,效率挺高。
不过具体原因还没有研究清楚。

你可能感兴趣的:(java,mysql)