Соединение JDBC с автоматическим снова соединяется

У Вас есть множество проблем. Во-первых, почему Вы используете свое определенное @@ значения FETCH_STATUS? Это должно просто быть @@ FETCH_STATUS = 0.

114-секундный, Вы не выбираете свой внутренний Курсор в ничто. И я не могу думать ни о каком обстоятельстве, где Вы выбрали бы все поля таким образом - обстоятельно объясняют их!

Вот образец, чтобы пройти. Папка имеет первичный ключ "ClientID", который является также внешним ключом для, Принимают участие. Я просто печатаю все Посещение UIDs, сломанного Папкой ClientID:

Declare @ClientID int;
Declare @UID int;

DECLARE Cur1 CURSOR FOR
    SELECT ClientID From Folder;

OPEN Cur1
FETCH NEXT FROM Cur1 INTO @ClientID;
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Processing ClientID: ' + Cast(@ClientID as Varchar);
    DECLARE Cur2 CURSOR FOR
        SELECT UID FROM Attend Where ClientID=@ClientID;
    OPEN Cur2;
    FETCH NEXT FROM Cur2 INTO @UID;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT 'Found UID: ' + Cast(@UID as Varchar);
        FETCH NEXT FROM Cur2 INTO @UID;
    END;
    CLOSE Cur2;
    DEALLOCATE Cur2;
    FETCH NEXT FROM Cur1 INTO @ClientID;
END;
PRINT 'DONE';
CLOSE Cur1;
DEALLOCATE Cur1;

Наконец, Вы УВЕРЕННЫЙ , Вы хотите сделать что-то вроде этого в хранимой процедуре? Это очень легко злоупотребить хранимыми процедурами и часто отражает проблемы в охарактеризовании Вашей проблемы. Образец, который я дал, например, мог быть намного более легко выполнен с помощью стандартных избранных вызовов.

11
задан MPelletier 27 January 2013 в 22:55
поделиться

3 ответа

Пусть пул соединений сделает это за вас, многие из них может проверить соединение. То же самое и с DBCP с параметром testOnBorrow , который принудительно проверяет работоспособность каждого соединения перед его использованием. Значение по умолчанию для этого параметра - true , просто нужно, чтобы validationQuery было установлено в ненулевую строку, чтобы иметь какой-либо эффект. Итак, установите validationQuery и готово! Обратитесь к документации .

3
ответ дан 3 December 2019 в 10:04
поделиться

Ознакомьтесь с библиотеками Oracle Universal Connection Pool (UCP). Они полностью совместимы с JDBC 4.0 и реализуют вызов isValid () для проверки наличия соединения. Эту проверку легко выполнить, если повторное подключение ложное, затем запустите свой запрос.

Страница загрузки Oracle UCP

Хотя я знаю, что вы не спрашивали о пулах подключений, вам, вероятно, все равно следует использовать один, так что это поможет вам двояко.

1
ответ дан 3 December 2019 в 10:04
поделиться

Даже если вы используете пул соединений JDBC, либо предоставленный сервером приложений, либо пул общих ресурсов apache, имеет смысл закодировать логику повтора. В зависимости от конфигурации вашего сервера приложений сервер приложений очистит все соединения в пуле и воссоздает новый набор соединений. Вот пример:

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//
// How many times do you want to retry the transaction
// (or at least _getting_ a connection)?
//
int retryCount = 5;
boolean transactionCompleted = false;
do {

  try {
    conn = getConnection(); // assume getting this from a
    // javax.sql.DataSource, or the
    // java.sql.DriverManager

    retryCount = 0;
    stmt = conn.createStatement();
    String query = "Some sample SQL";
    rs = stmt.executeQuery(query);
    while (rs.next()) {
    }
    rs.close();
    rs = null;
    stmt.close();
    stmt = null;

    conn.close();
    conn = null;
    transactionCompleted = true;
  } catch (SQLException sqlEx) {
    //
    // The two SQL states that are 'retry-able' 
    // for a communications error.
    //
    // Only retry if the error was due to a stale connection,
    // communications problem 
    //
    String sqlState = sqlEx.getSQLState();
    if ("Substitute with Your DB documented sqlstate number for stale connection".equals(sqlState) ) {
      retryCount--;
    } else {
      retryCount = 0;
    }
  } finally {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException sqlEx) {
        // log this
      }
    }
    if (stmt != null) {
      try {
        stmt.close();
      } catch (SQLException sqlEx) {
        // log this
      }
    }
    if (conn != null) {
      try {
        //
        // If we got here, and conn is not null, the
        // transaction should be rolled back, as not
        // all work has been done
        try {
          conn.rollback();
        } finally {

          conn.close();
        }
      } catch (SQLException sqlEx) {
        //
        // If we got an exception here, something
        // pretty serious is going on, so we better
        // pass it up the stack, rather than just
        // logging it. . .
        throw sqlEx;
      }
    }
  }
} while (!transactionCompleted && (retryCount > 0));
6
ответ дан 3 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: