Ошибка подключения к базе данных AS400 и данные набора результатов не удаляются при следующем вызове

Я пытаюсь подключиться к 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 = (Строка) 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);
        }
    

    } catch (исключение e) {}

  3. Получите строки из ResultSet один раз и получите правильные результаты - ОК

  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 соединение не существует


person sandhya mungroo    schedule 27.03.2013    source источник


Ответы (1)


Хорошо, поэтому в первом примере, поскольку у вас нет фигурных скобок, весь блок try выполняется, если conn == null.

Это означает, что если у вас было соединение до того, как сам запрос не был выполнен, а переменная результата будет указывать на все, что было сделано до того, как любой из вашего кода был выполнен.

Во втором примере мы видим, что выполняется запрос conn, потому что вы получаете исключение при попытке использовать соединение. Я подозреваю, что в этом случае conn не было равно null, и у вас уже была ссылка на соединение, когда вы вводили этот код.

Итак, я предполагаю, что вам удалось кэшировать ссылку на закрывающееся соединение, отсюда и текст SQLException. Я бы попытался полностью удалить условие if (conn == null) и всегда пытался получить соединение. Брокер в любом случае будет управлять этими подключениями и кэшировать их за вас.

person Dave    schedule 27.03.2013