为什么我用prepareStatement执行批量插入总是只能插入一条数据?
db = new Database(dbURL, false);
conn = db.getConn();
pstmt = conn.prepareStatement(preSql);
conn.setAutoCommit(false);
for (int j = 0; j < commitCount; ++j) {
try {
pstmt.clearBatch();
pstmt.clearParameters();
String[] tmp = ((String[])setConf.elementAt(j));
for (int i = 1; i <= tmp.length; ++i) {
pstmt.setString(i, tmp[i - 1]);
}
pstmt.addBatch();
} catch (
SQLException e) {
Loger.log.error( "some operation about pstmt throw SQLException!\n " + e);
continue;
}
}
tmpRets = pstmt.executeBatch();
conn.commit();
我用上面的代码执行批量的插入,只执行一次executeBatch操作,但每次只能插入第一条数据,所以更通的办法是在for里面执行这个操作,这样就是一条数据就提交一次了,效率肯定低。但我不知道为什么会这样。我看网上很多类似代码也是这样的逻辑的啊。
另外,如果我不需要事务,我能否不要setAutoCommit,这样好像又不是一次提交是吗?而是每次都提交吗?
------解决方案--------------------为什么要调用clearBatch()?
JDK DOC对这个方法的描述:
Empties this Statement object 's current list of SQL commands.
从这句话来看,岂不是整个SQL命令的列表都被清空了?
另外如果没有必要clearParameters()也无需调用。
DOC的说法是:
However, in some cases it is useful to immediately release the resources used by the current parameter values
除非你有必要即时释放当前参数占用的资源,否则没必要调用该方法。