1

我正在尝试AS400 DB从 Java 计算节点连接到一个但出现错误。你能给些建议么。

我的测试场景是:

  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 = (String)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 块。

这意味着如果您在查询本身未执行之前有一个连接,并且结果变量将指向它在执行任何代码之前所做的任何事情。

在第二个示例中,我们可以看到 conn 查询正在执行,因为当您尝试使用连接时出现异常。我怀疑在这种情况下 conn 不等于 null 并且您在输入此代码时已经引用了连接。

所以我的猜测是,您设法缓存了对关闭的连接的引用,因此是 SQLException 文本。我会尝试完全删除 if(conn == null) 条件并始终尝试获取连接。无论如何,Broker 都会为您管理和缓存这些连接。

于 2013-03-27T11:07:42.553 回答