Соединение закрывается при использовании Oracle UCP

Я получаю случайное сообщение об ошибке "Соединение закрыто: соединение закрыто" при использовании Oracle UCP, v 12.1.0.2.0. Похоже, что соединение помечено как закрытое в oracle.ucp.jdbc.proxy.JDBCConnectionProxyFactory#invoke:

if(Clock.isBefore(this.creationTS, this.m_jdbcPooledConnection.getAvailableStartTime()) || Clock.isBefore(this.creationTS, this.m_jdbcPooledConnection.getBorrowedStartTime())) {
      this.m_closed = Boolean.valueOf(true);
}

Clock.isBefore(this.creationTS, this.m_jdbcPooledConnection.getAvailableStartTime()) возвращает значение true.

Может кто-нибудь объяснить, для чего этот чек?

GetAvailableStartTime устанавливается, когда соединение восстанавливается в пул, creationTS - устанавливается, когда создается JDBCConnectionProxyFactory и создается при раздаче соединения.

IsBefore выглядит так:

public static boolean isBefore(long time1, long time2) {
        return time1 < time2 - 1000L;
}

Итак, является ли условие для случаев, когда соединение было возвращено менее секунды назад?

PS: пробный запрос проверки "выберите 1 из двойного" - безрезультатно

1 ответ

Если Clock.isBefore(this.creationTS, this.m_jdbcPooledConnection.getAvailableStartTime()) возвращается true тогда это означает, что UCP повторно обнаружил соединение и снова сделал его доступным. Обычно это происходит, если вы включаете сбор соединений в UCP. UCP определяет, когда соединение заимствовано, но не используется слишком долго (плохо спроектированное приложение), и во избежание утечек соединения оно возвращает соединение обратно и делает его доступным в пуле. Если исходный поток затем просыпается и пытается использовать соединение, он получает connection is closed ошибка.

Другие вопросы по тегам