有关addBatch(String)的注意事项

时间:2012-07-03 10:47:54

标签: java jdbc prepared-statement

addBatch() PreparedStatement方法旁边的addBatch(String)类中还有一个Statement方法。

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

1 个答案:

答案 0 :(得分:4)

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

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

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

根据JAVA Doc

无法在addbatch(String sql)PreparedStatement和sql上调用

CallableStatement方法 - 通常这是SQL INSERTUPDATE语句。

首选{p> addBatch()如果您想要批量插入或批量更新操作。

批处理执行的阻塞因素很少

DB make/version.
JDBC driver make/version.

例如:如果您使用的是MySQL,请使用最新的驱动程序将 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();