有关addBatch(String)的注意事项
在PreparedStatement
的addBatch()
方法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
无法在PreparedStatement
或CallableStatement
和sql上CallableStatement
addbatch(String sql)
方法 – 通常这是SQL INSERT
或UPDATE
语句。
首选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();