【问题标题】:Java code only works when submitted the second timeJava 代码仅在第二次提交时有效
【发布时间】:2014-07-11 05:20:05
【问题描述】:

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

过程“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();

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

【问题讨论】:

  • 请在你的 catch 块中执行 e.printStackTrace() 并在此处发布,请

标签: java oracle rest datasource dbms-job


【解决方案1】:

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

谢谢

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢@mst,但两个建议都没有结果:-(
    • 第一次执行后成功和消息的值是什么?
    • 成功为真,消息未定义
    • 你能从prepareCall修改你的sql吗?只是为了确保脚本正在执行。例如:begin insert into log_table (col1) values "someValue"; dbms_job.submit(?,?); end; 我相信 dlcm_agent 中没有发生任何事情,或者它执行时没有任何您可以看到的输出。
    • 我已经用一个简单的“更新表...”尝试过这个。马上就可以了。这就是为什么我认为它与在另一个模式中执行 proc 有关。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多