0

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呼び出しを実行する前に、このテーブルに対して挿入と削除を行っています...アイデアはありますか? 処理後にデータベースへのすべての接続を閉じても、テーブルがロックされたままになる原因は何ですか。

4

2 に答える 2

1

DB2 は、テーブルがいつ再び必要になるかわからないため、一時的にテーブルを部分的に開いたままにしておくことができます。次の 1 秒で別の UPDATE が発生する可能性があり、DB2 はすべてのトランザクションのフル オープンを回避したいと考えています。この状態が続く限り、ロック競合が発生する可能性があります。

このようなロックが発生した場合は、最初に RPG プログラムから ALCOBJ CONFLICT(*RQSRLS) を試してから、SaveObjectプロセスが完了するかどうかを確認してください。どのような場合に役立つかについては、そのパラメーターの ALCOBJ ヘルプ テキストを参照してください。

于 2014-10-01T00:01:01.193 に答える
0

さて、私は昨日と今日のほとんどをコードに費やし、最終的に何が起こっているのかを理解しました。

Websphere では、JDBC カスタム プロパティに trueAutoCommit という名前の変数があります。この変数はデフォルトで FALSE に設定されています。

これを true に変更しました。これにより、実行時にトランザクションを個別に完了できるようになりました。別の「トランザクション」を使用して RPG プログラムを呼び出しているため、テーブルがロックされていません。

于 2014-10-01T19:33:49.380 に答える