Oracle DB:java.sql.SQLException:关闭连接
Posted
技术标签:
【中文标题】Oracle DB:java.sql.SQLException:关闭连接【英文标题】:Oracle DB : java.sql.SQLException: Closed Connection 【发布时间】:2011-10-10 18:00:42 【问题描述】:java.sql.SQLException 的原因:来自 Oracle 的已关闭连接??
java.sql.SQLException: 关闭连接 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 在 oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:1131) 在 oracle.jdbc.OracleConnectionWrapper.commit(OracleConnectionWrapper.java:117)
我们从故障转移数据库连接中收到此错误。我们对其他数据库也使用相同的代码。但是只有一个数据库看到这个问题。这是因为连接可能由于长时间不活动而超时而我们正在尝试使用它吗?如果您需要更多详细信息,请告诉我...
AbandonedConnectionTimeout 设置为 15 分钟 InactivityTimeout 设置为 30 分钟
【问题讨论】:
【参考方案1】:这意味着连接在某个时候成功建立,但是当您尝试在那里提交时,连接不再打开。您提到的参数听起来像连接池设置。如果是这样,它们与这个问题无关。最可能的原因是您和数据库之间的防火墙在一定的空闲时间后终止连接。最常见的修复方法是让您的连接池在从中签出连接时运行验证查询。这将立即识别并清除死连接,确保您只从池中获得良好的连接。
【讨论】:
感谢您的回答。验证连接属性是否会增加任何开销?我只在其中一个数据库中看到了这一点,我也怀疑那个特定的数据库有问题。 它自然会增加一些开销,因为它必须实际访问数据库才能验证连接;但是,每个数据库都有一个推荐的“验证查询”来使用,它会在数据库端产生最小的开销,所以你会得到的唯一减速是来自任何网络延迟。不管问题如何,添加验证查询是避免从池中获取死连接的一种非常简单的方法。我相信目前推荐的 Oracle 查询是select 1 from dual
【参考方案2】:
您必须验证连接。
如果您使用 Oracle,您很可能使用 Oracle 的 Universal Connection Pool。以下假设您这样做。
验证连接的最简单方法是告诉 Oracle 在借用连接时必须对其进行验证。这可以通过
pool.setValidateConnectionOnBorrow(true);
但它仅在您保持连接一小段时间时才有效。如果您借用连接的时间较长,则在您持有连接时连接可能会断开。在这种情况下,您必须明确地验证连接
if (connection == null || !((ValidConnection) connection).isValid())
有关详细信息,请参阅Oracle documentation。
【讨论】:
如果你不能使用 UCP 或者不想处理在公共 maven 存储库上不可用的 Oracle 工件的问题,我最近发现 java.sql.Connection 有一个 isValid方法。它适用于超时。 而 oracle.ucp.jdbc.ValidConnection 的 isValid 导致我计划的记录器在 java.lang.ClassCastException 上崩溃以上是关于Oracle DB:java.sql.SQLException:关闭连接的主要内容,如果未能解决你的问题,请参考以下文章