мы работаем в реальном проекте с JdbcTemplate
и SimpleJedbcCall
для вызова хранимых процедур, в которых инкапсулированы основные бизнес-логи c.
К сожалению, наша база данных является более старой версией Sybase ASE. Для предупреждения об ошибке Sybase можно вызвать функцию raiserror 'bad error', 99999
, используя явный код ошибки. Эти коды ошибок должны находиться в определенном c диапазоне, но, например, быть более 17000, чтобы не быть системным исключением базы данных.
Наша проблема заключалась в том, что при вызове CallableStatement.getMoreResults () эта ошибка был брошен как SybException
, реализующий SqlException
, что приводит к исключению ( Строка 1096 ) и отмене соединения.
Мы сделали расширение JdbcTemplate и переопределение extractReturnedResults
- метод для регистрации проблемы и продолжения с нашей хранимой процедурой, включая такие вещи, как обработка транзакций. Из-за этих открытых транзакций у нас были действительно большие проблемы с производительностью и отслеживанием стека в нашей базе данных.
try {
moreResults = cs.getMoreResults();
updateCount = cs.getUpdateCount();
} catch (SybSQLException ex) {
MDC.put("errorLogId", String.format("%s-%s", nvTask.getApplikation(), nvTask.getTaskId()));
errLog.error("AUTOMAT_ERROR | orderNumber={}, procedure={}, line={}, message={}, errorCode={}, taskId={}, dbProcessId={}",
orderNumber, ex.getProcedureName(), ex.getLineNumber(), ex.getMessage(), ex.getErrorCode(),
nvTask.getTaskId(), dbProcessId);
MDC.remove("errorLogId");
}
if (logger.isTraceEnabled()) {
logger.trace("CallableStatement.getUpdateCount() returned " + updateCount);
}
Мой вопрос заключается в том, может ли такое поведение происходить и в других типах баз данных, если может быть универсальное c решение для избежать разрыва связи? Я открыт для любых советов и заранее спасибо.
Ура, Уве