【问题标题】:JDBC Multiple Batch Execution IssueJDBC 多批次执行问题
【发布时间】: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()

标签: java oracle jdbc


【解决方案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 包含所有条目,包括故意错误,所以全部回滚。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多