0

我在下面显示了一段代码。我的挑战是该代码仅在提交的第二次(第三次等)有效。我在两次提交之间没有任何改变,但第一次没有做它应该做的事情。两次我都得到了一份工作#,好像一切都很好。

程序“execute_plan”应该更新表中的一些行,直到第二次提交才完成。

我已经尝试监视 USER_LOGS 表,并且看不到第一次和第二次提交之间的任何区别。

我尝试用执行用户模式中的表的简单更新来替换对另一个模式的调用。这是第一次。

所以这个问题似乎与在另一个模式中调用一个过程有关。

编辑:我也尝试手动添加 conn.commit();,我在 PL/SQL 中添加了提交,但都是徒劳的 :-(

整个逻辑是从 java rest 服务调用的。

BasicDataSource bds = Util.getDatasource(nodeData);

String plsql = "declare x number; begin x := dlcm_agent.runner.execute_plan(" + nodeData.get("lcPlanId") + "); end;";

Connection conn = null;
JSONObject json = new JSONObject();

try {
    conn = bds.getConnection();
    CallableStatement stmt = conn.prepareCall("begin dbms_job.submit(?,?); end;");

    stmt.setString(2, plsql);
    stmt.registerOutParameter(1, Types.BIGINT);

    stmt.execute();

    json.put("success", true);
} catch (Exception e) {
    json.put("success", false);
    json.put("message", e.getMessage());
} finally {
    if (conn != null) conn.close();
}

return json.toString();

这让我发疯所以如果有人有任何意见请告诉我

4

2 回答 2

0

原来是一个未处理的比赛条件。我在提交的作业完成之前更新了一个表,这导致了错误。

谢谢

于 2014-05-23T08:39:50.177 回答
0

首先,最好关闭已经使用的stmt。此外,建议对进行一些数据操作的 stmts 使用 executeUpdate。

第三,dbms_job.submit - 只需将作业提交到作业队列。它不执行它(你可能知道它)。

于 2014-05-22T09:24:36.137 回答