jdbc默认是事务自动提交,每条sql执行都是一个事务,
批处理中也是如此,如果想将批处理作为一个事务处理,则要先关闭事务自动提交,改为手动提交,如下:
String sql = "insert into person(name, age) values (?, ?)";
try {
conn = getConn();
conn.setAutoCommit(false);//关闭自动提交
ps = conn.prepareStatement(sql);
int count = 0;
for (Person person : list) {
count++;
ps.setString(1, person.getName());
ps.setInt(2, person.getAge());
ps.addBatch();
}
int[] c = ps.executeBatch();
conn.commit();
logger.info("提交:" + c.length);
logger.info("总条数:" + count);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
} finally {
//关闭ps和conn
}
如果数据很多,为防止内存溢出,则需要分批提交,例如2000条提交一次。分批提交代码如下:
ps.addBatch();
if (count % 2000 == 0 || count == list.size()) {
try {
int[] c = ps.executeBatch();
conn.commit();//这里将每个批次作为一个事务
ps.clearBatch();//清除ps中的sql statement
logger.info("提交:" + c.length);
} catch (Exception e) {
logger.error(e.getMessage());
conn.rollback();
}
}