有关addBatch(String)的注意事项

PreparedStatementaddBatch()方法addBatch(String)Statement类中还有一个addBatch(String)方法。

我想处理一系列不同的sql语句,我正在寻找一些关于addBatch(String)意味着性能的澄清。 使用此方法是安全(和快速)还是更好地在Java中对类似的sql语句进行分组并在组中执行它们?

批处理允许您将相关的SQL语句分组到批处理中,并通过一次调用数据库来提交它们。

当您一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。

addBatch(String sql)是在接口java.sql.Statement定义的,而addBatch()是在java.sql.PreparedStatement定义的,是extends Statement的子接口之一。 (其他是java.sql.CallableStatement

根据JAVA Doc

无法在PreparedStatementCallableStatement和sql上CallableStatement addbatch(String sql)方法 – 通常这是SQL INSERTUPDATE语句。

首选addBatch()如果要进行批量插入或批量更新操作。

批量执行的阻塞因素很少

 DB make/version. JDBC driver make/version. 

例如:如果您正在使用MySQL,请使用最新的驱动程序add rewriteBatchedStatements = true到您的连接字符串,以使statement.addBatch()实际创建批量插入。

此外,您应确保自动提交为false。 维护一个计数器,该计数器到达该计数器executeBatch,当Java中的可用堆内存受到约束时,该计数器会有所帮助。

例:

 conn.setAutoCommit(false); PreparedStatement pStmt = conn.prepareStatement("INSERT INTO mytable (field1,field2) VALUES (?,?)"); for all values: pStmt.setString(1,val1); pStmt.setString(2,val2); pStmt.addBatch(); if ( i % 1000 == 0) { pstmt.executeBatch();// Execute every 1000 items } pstmt.executeBatch(); conn.commit();