JDBC多批处理执行问题

时间:2014-06-17 08:32:08

标签: java oracle jdbc

以下代码尝试执行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 =真

2 个答案:

答案 0 :(得分:1)

只有一批带有任何数据的插入,这包括INSERTD因此它正在回滚。为什么?这就是原因:

ArrayList<String> finalsql2 = new ArrayList<String>();
finalsql1.add("INSERT INTO M_TEST VALUES('PUJAN1','WRL')");
finalsql1.add("INSERTD INTO M_TEST VALUES('PUJAN2','WRL')");

您仍在此处向finalsql1添加条目,因此finalsql2finalsql2为空。

finalsql1包含所有条目,包括故意的错误,因此整个批次都会回滚。

答案 1 :(得分:1)