У Вас есть множество проблем. Во-первых, почему Вы используете свое определенное @@ значения 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;
Наконец, Вы УВЕРЕННЫЙ , Вы хотите сделать что-то вроде этого в хранимой процедуре? Это очень легко злоупотребить хранимыми процедурами и часто отражает проблемы в охарактеризовании Вашей проблемы. Образец, который я дал, например, мог быть намного более легко выполнен с помощью стандартных избранных вызовов.
Пусть пул соединений сделает это за вас, многие из них может проверить соединение. То же самое и с DBCP с параметром testOnBorrow
, который принудительно проверяет работоспособность каждого соединения перед его использованием. Значение по умолчанию для этого параметра - true
, просто нужно, чтобы validationQuery
было установлено в ненулевую строку, чтобы иметь какой-либо эффект. Итак, установите validationQuery
и готово! Обратитесь к документации .
Ознакомьтесь с библиотеками Oracle Universal Connection Pool (UCP). Они полностью совместимы с JDBC 4.0 и реализуют вызов isValid ()
для проверки наличия соединения. Эту проверку легко выполнить, если повторное подключение ложное, затем запустите свой запрос.
Хотя я знаю, что вы не спрашивали о пулах подключений, вам, вероятно, все равно следует использовать один, так что это поможет вам двояко.
Даже если вы используете пул соединений 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));