从Java调用RPG程序调用时,SaveObject作业失败

时间:2014-09-30 14:54:27

标签: java connection db2 jndi rpg

我试图用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调用之前,我正在对此表进行插入和删除...任何想法?即使我在处理后关闭了与数据库的所有连接,导致表仍然被锁定的原因。

2 个答案:

答案 0 :(得分:1)

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

如果您遇到此类锁定,请首先尝试RPG程序中的ALCOBJ CONFLICT(* RQSRLS),然后查看您的SaveObject进程是否完成。请参阅该参数的ALCOBJ帮助文本,以获取何时可以提供帮助的说明。

答案 1 :(得分:0)

好的,所以我花了昨天的大部分时间,今天通过代码,最后弄清楚发生了什么。

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

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