关于executeBatch()执行速度缓慢问题的疑问
如题,在SQL SERVER 2008处理大量数据的时候使用executeBatch()方法,在Insert时处理很快,而在update的时候会有很长的延时(猜测是每次都单独提交了,但是在程序中已经将自动提交关闭)
源码如下:
public class Satisfaction {
protected Log log = LogFactory.getLog(getClass());
public void service(Connection con_ltsms, String isAreaVersion,
String op_hosid, String op_id, String audit_flag, String type_from) {
String sql_cr = null;
String sql_count = null;
PreparedStatement pt_cr = null;
PreparedStatement pt_count = null;
ResultSet rs_cr = null; // 记录结果集
ResultSet rs_count = null;
int temp_i = 0; // 临时提交的一个变量
int temp_k = 0; // 临时提交的一个变量
int batchSize = 500;
try {
sql_cr = "SELECT * FROM t1 ";
sql_count = "SELECT count(*) FROM t1";
pt_cr = con_ltsms.prepareStatement(sql_cr);
pt_count = con_ltsms.prepareStatement(sql_count);
rs_cr = pt_cr.executeQuery();
rs_count = pt_count.executeQuery();
PreparedStatement pt_ques = null;
int count = 0;
while (rs_count.next()) {
count = Integer.parseInt(rs_count.getString(1)); // 获取总的记录数,用于后面的批量提交
}
// 以下是插入t2表,由于使用批量插入
PreparedStatement pstmt_sms = null;
String sql_sms = "insert into t2(a1,a2) "
+ "values (?,?)";
pstmt_sms = con_ltsms.prepareStatement(sql_sms);
con_ltsms.setAutoCommit(false);
// 以上是插入t2表
// 以下是更新t3表
String sql_flag = "UPDATE t3 SET a1=? WHERE a2=?";
PreparedStatement pt_flag = con_ltsms
.prepareStatement(sql_flag);
// 以上是更新t3表
while (rs_cr.next()) { // <开始> 逐记录处理
pstmt_sms.setString(1, rs_cr.getString("a1"));
pstmt_sms.setString(2, rs_cr.getString("a2"));
temp_i++;
if (((temp_i != 0) && (temp_i) % batchSize == 0)
|| (temp_i == count)) {
pstmt_sms.executeBatch(); // 每1000条提交一次最后一条提交一次//此处提交可以很快执行完成
con_ltsms.commit();
pstmt_sms.clearBatch(); // 提交后,Batch清空。
}
pt_flag.setString(1, a1);
pt_flag.setString(2, a2);
temp_k++;
pt_flag.addBatch();
if (((temp_k != 0) && (temp_k) % batchSize == 0)
|| (temp_k == count)) {
pt_flag.executeBatch(); // 每1000条提交一次//最后一条提交一次 此处执行会有停顿,猜测还是单条提交而不是批量提交
con_ltsms.commit();
pt_flag.clearBatch(); // 提交后,Batch清空。
}
}
} catch (Exception exp) {
try {
con_ltsms.rollback(); //程序运行出错,事物的回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
con_ltsms.setAutoCommit(true);
}
}