JDBC executeUpdate与executeBatch性能

时间:2017-11-22 14:00:40

标签: java sql database jdbc

我很想知道JDBC executeUpdate(multiQuerySqlString)与JDBC executeBatch()在执行多个更新/插入查询时的性能差异。

例如:

StringBuffer sb = new StringBuffer();
sb.append(updateQuery1+";");
sb.append(updateQuery2+";");
sb.append(insertQuery1+";");
statement.executeUpdate(sb.toString())

VS

preparedStatement = dbConnection.prepareStatement(updateQuery1);
preparedStatement.addBatch();
preparedStatement = dbConnection.prepareStatement(updateQuery2);
preparedStatement.addBatch();
preparedStatement = dbConnection.prepareStatement(insertQuery1);
preparedStatement.addBatch();
preparedStatement.executeBatch();

2 个答案:

答案 0 :(得分:2)

可能批处理将比executeUpdate(等)语句序列更快,因为批处理减少了Java< - >的数量。数据库往返,并可能使其他优化成为可能。

但是,实际的性能差异将取决于您使用的JDBC驱动程序和后端数据库。

获得适用于您的(假设的)用例的答案的唯一方法是使用您的实际数据库,驱动程序,SQL和数据集来对实现操作的两种替代方法进行基准测试。

答案 1 :(得分:1)

您的示例中存在两个问题:

  1. 多重查询字符串容易受SQL Injection攻击,因为您将自己操纵查询。
  2. 您的批量更新错误。您正在重新分配变量预处理语句。请在此处查看如何正确使用:https://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
  3. BatchInsert示例:

    dbConnection.setAutoCommit(false);//commit trasaction manually
    
    String insertTableSQL = "INSERT INTO DBUSER"
            + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES"
            + "(?,?,?,?)";
    PreparedStatement = dbConnection.prepareStatement(insertTableSQL);
    
    preparedStatement.setInt(1, 101);
    preparedStatement.setString(2, "mkyong101");
    preparedStatement.setString(3, "system");
    preparedStatement.setTimestamp(4, getCurrentTimeStamp());
    preparedStatement.addBatch();
    
    preparedStatement.setInt(1, 102);
    preparedStatement.setString(2, "mkyong102");
    preparedStatement.setString(3, "system");
    preparedStatement.setTimestamp(4, getCurrentTimeStamp());
    preparedStatement.addBatch();
    preparedStatement.executeBatch();
    
    dbConnection.commit();