【问题标题】:SaveObject Job Fails on RPG Program Call From Java从 Java 调用 RPG 程序时 SaveObject 作业失败
【发布时间】:2014-09-30 14:54:26
【问题描述】:

我正在尝试从 Java 调用 RPG 程序。我可以使用 DriverManager 使程序正确运行,如下所示:

Connection conn = DriverManager.getConnection("jdbc:as400://" + "sys" + "", "username", "pass");
Statement stmt = conn.createStatement();
Boolean sqlBool = stmt.execute("call DB2.PROGRAM");

但是...这不是我想要的方式。我想使用 JNDI 连接到 400 并运行程序调用,因为这是我运行 SELECT、UPDATES、DELETES 等的方式...

这是我目前的伪代码,我在 SaveObject 上的 RPG 失败。

Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup(JNDI_NAME);
Connection conn = datasource.getConnection();
Statement stmt = conn.createStatement();
Boolean sqlBool = stmt.execute("call DB2.PROGRAM");

这是 JNDI 连接的问题还是 RPG 的问题?

更新:似乎当 SaveObject 作业开始工作时,它表示该表已锁定。在运行 RPG 调用之前,我正在对这个表进行插入和删除......有什么想法吗?即使我在处理后关闭与数据库的所有连接,什么会导致表仍然被锁定。

【问题讨论】:

    标签: java connection db2 jndi rpg


    【解决方案1】:

    DB2 可以将表保持部分打开一段时间,因为它不知道何时再次需要它。下一秒可能会出现另一个 UPDATE,而 DB2 希望避免对每个事务都完全打开。只要这种情况继续存在,您就会发现锁争用。

    如果您遇到这样的锁,请先尝试您的 RPG 程序中的 ALCOBJ CONFLICT(*RQSRLS),然后查看您的 SaveObject 进程是否完成。有关何时有用的说明,请参阅该参数的 ALCOBJ 帮助文本。

    【讨论】:

      【解决方案2】:

      好的,所以我昨天和今天的大部分时间都在检查代码,最后弄清楚发生了什么。

      在 Websphere 中,在 JDBC 自定义属性中有一个名为:trueAutoCommit 的变量。此变量默认设置为 FALSE。

      我将其更改为 true,它允许事务在运行时单独完成,现在我使用单独的“事务”调用 RPG 程序,它不会锁定表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 2019-02-06
        • 1970-01-01
        • 2011-04-16
        • 2011-03-20
        • 2014-06-29
        • 1970-01-01
        相关资源
        最近更新 更多