连接中断后如何自动重新连接Oracle连接池?

Posted

技术标签:

【中文标题】连接中断后如何自动重新连接Oracle连接池?【英文标题】:How to auto reconnect Oracle connection pool after connection interruption? 【发布时间】:2010-11-08 06:44:43 【问题描述】:

我遇到了通过 OracleConnectionCacheImpl 进行 Oracle 连接池的问题。当我通过瘦驱动程序连接到我的数据库服务器(Oracle 10g)上的连接池时,一切正常,直到在未指定的时间之后,数据库连接被丢弃(可能是由于空闲连接?)并且我收到一条错误消息:

关闭连接。

刷新页面并重新尝试连接会重新连接数据库,因此它似乎不是网络或数据库的问题。如果池中的连接因任何原因死亡,Oracle 连接池是否可以验证其连接并重新连接?

我正在使用 Apache Tomcat 6.0.18,Java EE6 更新 11。

(Oracle瘦驱动程序中似乎有一个ping功能。这有帮助吗?我在哪里可以找到它?)

【问题讨论】:

1) 您能否为关闭的连接添加整个堆栈跟踪 2) 您是否将 InactivityTimeout、TimeToLiveTimeout 或 AbandonedConnectionTimeout 设置为任何非默认值? 3) 你使用 ValidateConnection 吗? 4) 应用服务器和数据库服务器之间的物理连接是否在网络级别被切断,例如通过防火墙? 在哪里设置这些参数?我是 Oracle 编程新手,所以我不确定在哪里可以找到这些参数。我在哪里可以找到 ValidateConnection 并强制重新连接? (在看到错误后立即刷新浏览器即可立即解决问题。我不确定这是否是防火墙问题。) 参考download.oracle.com/docs/cd/B19306_01/java.102/b14355/… 并发送整个错误堆栈,这会很有帮助 +1 验证连接。我在 .NET 世界中遇到了同样的问题,必须将 Validate Connection=true 添加到连接字符串中。您的语法可能会因 jdbc 而异。 【参考方案1】:

使用另一个连接池库,例如 C3P0 并使用自动reconnect 的功能。

【讨论】:

【参考方案2】:

Apache DBCP(数据库连接池)将在这里提供帮助。您可以使用“validationQuery”参数进行配置,该参数是一个 SQL 查询,可在从池中删除的连接上运行,然后再将其提供给您。如果查询失败,则丢弃该连接并建立一个新连接并提供给您。

查看这里http://commons.apache.org/proper/commons-dbcp/configuration.html了解更多详情。

注意,每次从池中获取连接时都会调用validationQuery,因此它需要尽可能快。例如:

SELECT id FROM users LIMIT 1;

【讨论】:

【参考方案3】:

您可以在 context.xml 中添加一些配置参数,以便 tomcat 连接池将处理死连接。这是 context.xml 的一个示例,请根据您的设置使用用户/密码/url/端口等。

<?xml version="1.0" encoding="UTF-8"?>
<Context path="">
    <!-- Specify a JDBC data source -->
    <Resource name="jdbc/db" auth="Container"
              type="javax.sql.DataSource"
              username="user"
              password="password"
              driverClassName="driver.class.fullpath"
              url="jdbc:oracle://localhost:3306/
              maxActive="50"
              maxIdle="10"
              testOnBorrow="true"
              testWhileIdle="true"
              validationQuery="/* ping */"
              removeAbandoned="true"
              logAbandoned="true"/>
</Context>

【讨论】:

以上是关于连接中断后如何自动重新连接Oracle连接池?的主要内容,如果未能解决你的问题,请参考以下文章

当连接变坏时,有啥方法可以让 JBoss 连接池重新连接到 Oracle?

oracle闲置超时,怎么样重新连接(急)

vb2010 (vb.net )Socket套接字当网络中断时或服务器意外关机,客户端如何自动重新连接服务端

oracle连接数如何自动自动释放

使用连接池一段时间后自动提交更改为 TRUE

如何检查oracle数据库端的socket通信中断