2

我试图找出使用 PreparedStatement executeBatch() 方法的最佳方法。

我尝试的一种方法是:

try{
    prepStmt1 = conn.prepareStatement("update table set done='yes' where phone=?");
    while (operatorsQuery.next() ) {
          logger.info("phone: "+ phone + ",  operator: " + operator);

          process(); //0.5-1 second long
          prepStmt1.setString(1, "0"+phone);
          prepStmt1.addBatch();
    }
prepStmt1.executeBatch();
}
catch{...}
finally{
    closeStatmentand(prepStmt1);
}

我在这段代码中遇到的问题是程序可以在中间退出,然后它可能无法到达 executeBatch() 方法。

我尝试的第二种方法:

try{
    prepStmt1 = conn.prepareStatement("update table set done='yes' where phone=?");
    while (operatorsQuery.next() ) {
          logger.info("phone: "+ phone + ",  operator: " + operator);

          process(); //0.5-1 second long
          prepStmt1.setString(1, "0"+phone);
          prepStmt1.addBatch();
          if ((j + 1) % 100 == 0) {
               prepStmt1.executeBatch();
          }
    }
prepStmt1.executeBatch();
}
catch{...}
finally{
    closeStatmentand(prepStmt1);
}

哪种方法是最好的方法?

4

2 回答 2

4

通过使用批量更新,除非有特定的调用,否则不会将查询发送到数据库,executeBatch();如果您担心用户可能会退出程序并且无法执行,为什么不逐个执行更新。和连接是autoCommit(true);默认设置的。

如果应用程序关闭,您将无法调用提交,并且在调用显式调用之前,查询尚未发送到数据库execute

执行增量批处理就可以了。

=======编辑=======

如果您的问题确实是性能问题,并且您的应用程序突然退出有问题,请尝试使用 Java 消息服务或 JMS。JMS 使您能够异步发送消息,这意味着您的应用程序会将这些“数据”转发给 JMS,而不是等待响应,然后您将对 JMS 进行编程以将它们插入数据库。JMS 也足够持久,当应用程序/服务器出现故障时,发送的数据(也称为队列)一旦恢复正常,仍然存在。

虽然 JMS 不适合初学者,而且很难从头开始实施。希望这会有所帮助: http ://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html

于 2013-06-20T07:26:53.747 回答
0

https://examples.javacodegeeks.com/core-java/sql/jdbc-batch-update-example/

public void batchUpdateUsingStatement() throws SQLException {

// This is to hold the response of executeBatch()
int[] result = null;
try {
        Statement stmt = connection.createStatement();

        connection.setAutoCommit(false); // Setting auto-commit off
        String SQL = "update person set firstName='New First Name', lastName='New Last Name' where id=1";
        stmt.addBatch(SQL); // add statement to Batch
        SQL = "update person set firstName='First Name',lastName='Last Name' where id=2";
        stmt.addBatch(SQL); // add second statement to Batch
        result = stmt.executeBatch(); // execute the Batch
        connection.commit(); // commit
    } catch (SQLException e) {
        connection.rollback(); // rollBack in case of an exception
        e.printStackTrace();
    } finally {
        if (connection != null)
            connection.close(); // finally close the connection
    }
    System.out.println("Number of rows affected: " + result.length);
}
于 2018-05-11T18:07:59.880 回答