使用Oracle UCP 12.1.0.2.0版本时,我收到随机的"连接已关闭:连接已关闭"错误。看起来连接已标记为封闭oracle.ucp.jdbc.proxy.JDBConnectionProxyFactory#调用:
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:已尝试验证查询"select 1 from dual"-无效果
如果Clock.isBefore(this.creationTS, this.m_jdbcPooledConnection.getAvailableStartTime())
返回true
,则表示UCP已重新调用连接并使其再次可用。如果在UCP中打开连接获取,通常会发生这种情况。UCP检测何时借用了连接但使用时间过长(应用程序设计不当),为了避免连接泄漏,它将收回连接并使其在池中可用。如果原始线程随后唤醒并尝试使用连接,则会出现connection is closed
错误。