asp.net - ODP.NET 连接池问题 - 数据库宕机后的容错

标签 asp.net connection-pooling odp.net

我有一个使用 ODP.NET 的 WebAPI 服务来连接到多个 Oracle 数据库。通常,Web 服务每秒会受到多次攻击,并且永远不会长时间处于不活动状态。然而,在我们的测试站点中,我们有 2-3 天没有使用它。今天早上,我们访问该服务并从 ODP.NET 收到“连接请求超时”异常,表明连接池没有可用连接。我们将在使用后关闭连接。在此期间之前服务运行良好,但今天第一个查询出现超时异常。我们在 IIS 中的应用程序池配置为永不重置。

我的问题是,什么会导致连接池在一段时间不活动后充满坏连接,而这些连接在通常的 3 分钟周期内没有被清理掉?我们的 3 个数据库中只有 2 个发生了这种情况,并且为所有数据库设置了 Validate Connection=true。

编辑 因此,在与 DBA 交谈后,手动或超时终止连接/ session 与数据库服务器切断 TCP 连接之间存在一些不同。在这种情况下,TCP 连接作为定期备份的一部分被切断(为什么对此并不重要)。我猜当整个数据库服务器立即离线时就会发生这种情况。我认为这个问题的基础仍然适用:为什么 ODP.NET 无法清理超时断开的连接?有一个性能计数器指的是“停滞”连接,这些连接是否会陷入该状态?我认为它应该能够看到连接不再事件(Validate Connection=True),杀死它而不将其返回到池中。

当然,这个问题可以通过在数据库出现故障时重置应用程序池来解决。我仍然想配置 ODP.NET 连接池以提高容错能力。

最佳答案

我遇到了同样的问题,我找到的唯一解决方案是将“连接生命周期”连接字符串参数与“验证连接”结合使用。

在我的特定情况下,在服务器上设置了连接超时,池中的连接会超时,但不会被从池中删除,从而导致错误。

设置“连接生命周期”和“验证连接”参数已解决该问题。

确保您选择的连接生命周期值小于服务器连接不活动超时。

关于asp.net - ODP.NET 连接池问题 - 数据库宕机后的容错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613960/

相关文章:

c# - 检查网站是 TLS 还是 SSL 及其版本

mysql - 负载均衡级联 JDBCTap for MySQL

Java JDBC 连接和 Oracle

vb.net - 我如何获得 Oracle.DataAccess.Client?

asp.net - 打印友好的 ASP.NET MVC 3 View

c# - ASP.NET 在引号内使用 ViewBag

asp.net - 如何使用 ASP.NET 授权但允许访问 .css 文件?

oracle - UniversalConnectionPoolManagerMBean 已注册

sql-server - 无法添加 Oracle OLEDB 提供程序的性能计数器

oracle - ODP.NET 托管驱动程序在命令超时的情况下不返回控制权