ODP.NET连接请求超时

6
我有一个Web应用程序托管在IIS 7上,使用Oracle.DataAcess.dll for .NET执行连接和查询到Oracle数据库。在过去的一周中,我们突然遇到了许多由该组件引发的错误,显示为:“连接请求超时”。经过几个小时的调试,我发现错误确实是说连接请求已超时,并抛出带有代码号码-1000的错误(来自oracle.DataAccess,没有抛出ORA-错误)。在Oracle数据库中,我看到只有一个连接用于该机器,并且处于“INACTIVE”状态。尽管只有一个连接,但在调试时实际上超时了,当尝试打开连接时。我们不使用连接池策略,但是在调试模式下,我看到有一个默认的连接池(即使未指定值),它表明最大连接数为100,超时时间为15秒,生命周期为0。这意味着该机器上的应用程序可以处理100个连接。

话虽如此,我无法理解为什么我的应用程序可以创建多达100个连接(根据默认连接池的设置),但我的数据库只显示了几个连接,而我却收到“连接请求超时”的错误,错误代码为-1000。

需要注意的是,我能够解决这个问题,具体方法是重新启动我的应用程序,但这已经不止一次发生了,所以这不是解决这个问题的方法...

我是否漏掉了什么内容?

我的应用程序是否实际上使用了比我看到的更多的连接?

*更新: 在调试期间,我发现许多线程卡在Oracle.DataAccess的“PopulatePool”方法上,还有许多其他线程卡在“WaitForRegularConnection”方法上...

All threads Populate pool stack trace


这是间歇性发生还是一直发生? - Gilles
它会间歇性地发生... 每隔几个小时,我的服务器就会出现这种情况。 - Amit Ben Ami
请启用调试跟踪并分享信息。TraceLevel 2(连接池统计)将足够。http://docs.oracle.com/cd/B28359_01/win.111/b28375/featDebug.htm - Alexandr Nikitin
我反编译了代码,为了帮助你。但我真希望自己从未这样做过,太糟糕了!!!跟踪是唯一的选择 :( - Alexandr Nikitin
1
你使用的是哪个版本的ODP.NET?我们在从“旧”的11.x ODP.NET驱动程序迁移到新的12c托管驱动程序后遇到了类似的问题。旧的驱动程序是从普通的ODP.NET包(需要安装大量MB)中安装的。我们迁移到了只需要一个4 MB程序集的新托管驱动程序。现在我们在连接池方面遇到了严重的问题。正如你所说,我们不管理池(这是提供程序的事情),但某种程度上它的行为与以前不同。我们认为新的驱动程序没有正确地回收池。有什么想法吗? - Raul
2个回答

0
请注意Oracle的调用,查询被发送以进行执行,连接超时不取决于连接池的最大计数,您的请求永久为一个连接提供服务。记录您的请求并尝试模拟它们,在数据库中检查执行持续时间。

0
你所经历的问题可能是由于服务器负载过大,或其他原因导致处理新查询的时间过长。
  1. 如果可以,请查看服务器的负载日志,以了解在您遇到超时时发生了什么。如果您只使用该服务器托管此数据库(更好的选择),请参考第二个选项。

  2. 您的应用程序可能使用了一些包,这些包会逐渐拥挤SGA,并且由于会话未被撤销,会占用太多资源。因此,解决方案是跟踪这个“持久”的会话,并查看它正在尝试做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接