1

Java 計算ノードからに接続しようとしてAS400 DBいますが、エラーが発生します。あなたがアドバイスしていただけますか。

私のテストシナリオは次のとおりです。

  1. ブローカ フローは 9 秒ごとにトリガーされ、行の選択と削除を実行しますAS400 DB

  2. AS400 DBを使用して接続しJDBC_TransactionType.MB_TRANSACTION_AUTOます。

    try { // AS400 サーバーへの接続を取得 if (conn == null) try { conn = getJDBCType4Connection("AS400db",JDBC_TransactionType.MB_TRANSACTION_AUTO); strSelectStoredProcName = (文字列)getUserDefinedAttribute("SelectStoredProcName"); 結果 = 新しい CDBItaly_CoreSelectCustomerDetails().retrievePPWICustomerDetails(conn, strSelectStoredProcName);

        } catch (SQLException e) {
            //store any error code and description in the environment tree.
            mbElement.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "ErrorCode", CDBItalyErrorCodes.CDB_ITALY_0001.toString());
            mbElement.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "ErrorDesc", CDBItalyErrorCodes.CDB_ITALY_0001.getErrorDescription());
            catchTerminal.propagate(assembly);
        }
    

    キャッチ(例外e){}

  3. 一度 ResultSet から行を取得し、正しい結果を得る - OK

  4. rs.DeleterOW を使用してテーブルからすべての行を削除します。つまり、ResultSet は次回は何も返さないはずです。

  5. もう一度フェッチしてみてください (これで 0 行が返されるはずです)。ただし、データベース テーブルが空であっても、手順 2 とまったく同じ行が返されます。

  6. ブローカー フローを再起動すると、正常に動作します。

コードを次のように変更すると、次のようになります。

try {
    //get connection to the AS400 server            
    if (conn == null) {
        conn = getJDBCType4Connection("AS400db",JDBC_TransactionType.MB_TRANSACTION_AUTO);
    }

    try { 
        strSelectStoredProcName = (String)getUserDefinedAttribute("SelectStoredProcName");
        result =  new  CDBItaly_CoreSelectCustomerDetails().retrievePPWICustomerDetails(conn, strSelectStoredProcName);

    } catch (SQLException e) {
        //store any error code and description in the environment tree.
        mbElement.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "ErrorCode", CDBItalyErrorCodes.CDB_ITALY_0001.toString());
        mbElement.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "ErrorDesc", CDBItalyErrorCodes.CDB_ITALY_0001.getErrorDescription());
        catchTerminal.propagate(assembly);
} catch(Exception e){}                  

エラーが表示されます:java.sql.SQLException接続が存在しません

4

1 に答える 1

0

最初の例では、中括弧がないため、conn == null の場合、try ブロック全体が実行されます。

これは、クエリ自体が実行されていない前に接続があった場合、結果変数は、コードが実行される前に行ったものを指すことを意味します。

2 番目の例では、接続を使用しようとすると例外が発生するため、conn クエリが実行されていることがわかります。この場合、conn は null と等しくなく、このコードを入力した時点ですでに接続への参照があったと思われます。

だから私の推測では、閉じられた接続への参照をキャッシュすることができたので、SQLException テキストです。if(conn == null) 条件を完全に削除して、常に接続を取得しようとします。いずれにせよ、ブローカーはこれらの接続を管理してキャッシュします。

于 2013-03-27T11:07:42.553 に答える