我有一个使用ODP.NET的WebAPI服务来连接几个oracle数据库。通常情况下,Web服务每秒会被点击几次,并且永远不会长时间处于不活动状态。然而,在我们的测试网站中,我们没有使用它2-3天。今天早上,我们点击了服务并获得了#34;连接请求超时"来自ODP.NET的异常,表明连接池没有可用的连接。我们正在关闭使用后的连接。该服务在此期间之前工作正常,但今天第一个查询得到了超时异常。我们在IIS中的应用程序池配置为永不重置。
我的问题是,在一段时间不活动之后,什么会导致连接池填充错误的连接,这些连接在通常的3分钟周期内没有被清除?它只发生在3个数据库中的2个,并且为所有数据库设置了Validate Connection = true。
修改 因此,在与DBA交谈之后,手动或超时杀死的连接/会话与数据库服务器切断TCP连接之间存在一些不同。在这种情况下,TCP连接被切断为常规备份的一部分(为什么对此不重要)。我想这会在整个数据库服务器立即脱机时发生。问题的基础仍然适用我认为:为什么ODP.NET无法超时清理切断的连接?有一个性能指示器,指的是" Stasis"连接,那些连接可能会卡在那个状态吗?我认为应该能够看到连接不再处于活动状态(Validate Connection = True),将其终止并不将其返回池中。
当然,只需重置数据库关闭的所有内容即可解决此问题。我仍然希望将ODP.NET连接池配置为更具容错能力。
答案 0 :(得分:1)
我遇到了同样的问题,我找到的唯一解决方案是将Connection Lifetime连接字符串参数与Validate Connection结合使用。
在我的特定情况下,连接超时是在服务器上设置的,并且池中的连接会超时,但不会从池中删除,从而导致错误。
设置连接生命周期和验证连接参数已解决了该问题。
确保您选择的连接生命周期值小于服务器连接不活动超时。
答案 1 :(得分:1)
推荐的解决方案是使用ODP.NET Fast Connection Failover(FCF)。 FCF将自动从池中删除无效连接,这样您就不需要使用验证连接,连接生命周期,也不需要清除池。
要使用FCF,请设置“HA events = true”,使用连接池,并让DBA在服务器端设置快速应用程序通知(FAN)。当数据库服务或节点关闭或重新启动时,FAN会向ODP.NET池发出警报。收到消息后,ODP.NET知道要从池中删除哪些连接并将其删除,保持所有其他有效连接不变。
答案 2 :(得分:0)
此处还有其他事情发生。最小池大小和一些其他设置有助于在连接从DBA配置的空闲超时和防火墙tcp空闲超时等方面切断时,在创建新连接时会发生“连接请求超时”。
这可能是简单的网络问题。可能存在干扰服务器的DNS解析的事情。另一种情况是在tnsnames中没有完全限定条目。我已经被后者咬了几次。
另一个问题是你已经认识到的问题 - 完整的游泳池。
仔细检查您是否在某处没有连接泄漏。缺少.Close是一回事,但如果你没有使用'using'语句,则需要try / finally,因为在.Close之前可能会抛出未处理的异常。
我会使用perfmon监视一些连接统计信息来启动 - NumberOfPooledConnections,NumberOfActiveConnections等: