【发布时间】:2014-06-17 18:05:23
【问题描述】:
以下代码尝试执行 3 次批量插入。第二批的第二条语句是故意错误的(INSERTD)。当我运行这个程序时,应该执行第 1 批和第 3 批并将数据插入到数据库中。
但它没有插入数据。有人能说出为什么吗?以及如何修复以便无论其他批次如何都应执行正确的批次。
public class Test {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
ArrayList<String> finalsql1 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')");
ArrayList<String> finalsql2 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')");
ArrayList<String> finalsql3 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN2','WRL')");
System.out.println("OP1=" + insertEntity(finalsql1));
System.out.println("OP2=" + insertEntity(finalsql2));
System.out.println("OP3=" + insertEntity(finalsql3));
}
public static boolean insertEntity(ArrayList<String> finalsql) throws SQLException {
Connection conn = null;
Statement ps = null;
boolean result = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
ps = conn.createStatement();
for (String sql : finalsql) {
System.out.println("sql > " + sql);
ps.addBatch(sql);
}
int[] count = ps.executeBatch();
result = true;
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
result = false;
} finally {
conn.commit();
ps.close();
conn.close();
}
return result;
}
}
输出
OP1=真
OP2=假
OP3=真
【问题讨论】:
-
我正在调用方法三遍。所以第一批的交易应该成功了吧?
-
你的意思是,那个表
M_TEST是空的??? -
在
main的第二和第三部分,您仍然使用finalsql1.add(),而不是分别使用finalsql2.add()和finalsql3.add()。