Java代码仅在第二次提交时才有效

时间:2014-05-22 09:03:02

标签: java oracle rest datasource dbms-job

我有下面显示的代码。我的挑战是代码只能在它提交的第二个(第三个等等)时间运行。我在两个提交之间没有任何改变,但是第一次没有做到它应该做的事情。两次我找到一份工作#就好像一切都好了。

程序'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();

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

2 个答案:

答案 0 :(得分:0)

首先,关闭已经使用过的stmt会很好。 此外,建议对执行某些数据操作的stmts使用executeUpdate。

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

答案 1 :(得分:0)

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

由于