1 回答
TA贡献1993条经验 获得超5个赞
您正在循环的每次迭代中创建一个新的 PreparedStatement。您需要在调用 executeBatch 的同一个 PreparedStatement 对象上排队执行批处理。目前您只执行第 1000 个排队查询。
StringBuilder sql = new StringBuilder(
"UPDATE USERS SET\n"
);
sql.append("USER_TYPE=?,\n")
.append("FIRST_NAME=?,\n")
.append("LAST_NAME=?,\n")
.append("EMAIL_ADDRESS=?\n");
sql.append("WHERE USER_ID=?");
preparedStatement = connection.prepareStatement(sql.toString());
for (User user : updatedUsers) {
preparedStatement.setString(1, user.getUserTypeId());
preparedStatement.setString(2, user.getFirstName());
preparedStatement.setString(3, user.getLastName());
preparedStatement.setString(4, user.getEmailAddress());
preparedStatement.setString(5, user.getUserId());
preparedStatement.addBatch();
// Submit in batches of 1000
if (++count % batchSize == 0) {
rowsAffected += IntStream.of(preparedStatement.executeBatch()).sum();
preparedStatement.clearBatch();
}
}
为了确定受影响的行(在 sql server 2005+ 中),您可以在 SQL 中使用 OUTPUT 子句让数据库返回受影响的行数据。文章
添加回答
举报