Что делать, когда NamedParameterStatement QueryTimeout не всегда вызывает тайм-аут прохождения исключения - PullRequest
0 голосов
/ 21 мая 2019

У меня есть приложение 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) {[...]}
[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...