我正在尝试从 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 等的方式...
这是我到目前为止的伪代码,我的 RPG 在 SaveObject 上失败了。
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 调用之前,我正在对该表进行插入和删除...有什么想法吗?即使我在处理后关闭与数据库的所有连接,什么会导致表仍然被锁定。
最佳答案
DB2 可以使表保持部分打开一段时间,因为它不知道何时再次需要它。下一秒可能会出现另一个 UPDATE,并且 DB2 希望避免每个事务都完全打开。只要这种情况持续下去,就可以发现锁争用。
如果遇到此类锁定,请先从 RPG 程序中尝试 ALCOBJ CONFLICT(*RQSRLS),然后查看 SaveObject
进程是否完成。请参阅该参数的 ALCOBJ 帮助文本,了解该参数何时有用的说明。
关于java - 从 Java 调用 RPG 程序时 SaveObject 作业失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123899/