2014-09-30 24 views
0

我想從Java調用角色扮演程序。我可以使用DriverManager正確運行程序,如下所示:保存對象作業從Java角色扮演程序調用失敗

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調用之前,我正在對該表執行插入和刪除操作...有什麼想法?即使我在處理後關閉了與數據庫的所有連接,也會導致表仍然被鎖定。

回答

0

好吧,所以我花了大部分時間在昨天和今天通過代碼,並最終找出發生了什麼。

在Websphere中,在JDBC自定義屬性中有一個名爲:trueAutoCommit的變量。該變量默認設置爲FALSE。

我將其更改爲true,它允許事務在運行時單獨完成,現在我使用單獨的「事務」調用RPG程序,它不鎖定表。

1

DB2可以將表部分保持一段時間打開,因爲它不知道什麼時候需要它。另一個UPDATE可能會在下一秒出現,DB2希望避免每個事務都完全打開。只要這種情況持續下去,你可以找到一個鎖爭用。

如果遇到這種鎖,請先嚐試RPG程序中的ALCOBJ CONFLICT(* RQSRLS),然後查看您的SaveObject過程是否完成。請參閱該參數的ALCOBJ幫助文本以瞭解何時可以提供幫助。

相關問題