У меня есть приложение Java 8, которое использует NamedParameterStatement для вставки в таблицу оракула. Я установил тайм-аут запроса на 20 секунд. Похоже, что на прошлой неделе немногие запросы сталкивались с блокировкой БД в течение многих часов, игнорируя время ожидания запроса.
Мне нужно, чтобы блокировка БД не влияла на мой запрос и не вызывала исключение после тайм-аута.
Мы были вынуждены перезагружать веблоги один за другим. Когда java-приложение было остановлено на одном из экземпляров weblogic, оно, похоже, убило блокировку базы данных, и все Statement.execute для того же значения были переданы другому экземпляру weblogic. Затем я вижу, что выполнение выполняется часами, игнорируя запрос времени ожидания.
!!!! [HistoriqueDataBase] - Temps d'insertion: 191524244
Проблема была в другом экземпляре weblogic, в котором одно и то же приложение Java запускалось в разное время, но всегда для одной и той же вставки и для одинаковых значений.
вставить в sameTable (id_reqt, id_util_appl, TMS_CREA)
значения («SameValue», «SameApplication», SYSDATE);
public NamedParameterStatement getStatement(int seconds, String query) throws SQLException {
if (statement == null || statement.isClosed()) {
statement = new NamedParameterStatement(connection, query);
}
statement.setQueryTimeout(seconds);
return statement;
}
[...]
try (NamedParameterStatement statement = getStatement(20, query)) {
queryFactory.addParametersToStatement(statement);
long startTime = System.currentTimeMillis();
statement.execute();
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
logger.debug("!!!! [HistoriqueDataBase] - Temps d'insertion : {}", elapsedTime);
} catch (Exception e) {[...]}
[...]