2016-01-01 3 views
2

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

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()) возвращает истину.

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

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

isBefore выглядит следующим образом:

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

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

пс: попытался проверки запроса «выберите один из двух» - отсутствие эффекта

ответ

0

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