【发布时间】:2017-04-08 14:11:15
【问题描述】:
我有一个托管在 IIS 7 上的 Web 应用程序,使用适用于 .NET 的 Oracle.DataAcess.dll 来执行到 Oracle 数据库的连接和查询。 在上周,我们突然遇到这个组件抛出的大量错误,说:“连接请求超时。”。
经过几个小时的调试,我看到这个错误真的是说连接请求已经超时,并且抛出了一个错误码号:-1000(在oracle.DataAccess中,没有抛出ORA-错误)。 在 Oracle 数据库中,我看到该机器只有一个连接,并且它处于“非活动”状态。 虽然只有一个连接,但在调试时尝试打开连接时实际上超时了。
我们不使用连接池策略,但正如我在调试模式下看到的那样,有一个默认连接池(即使没有指定值)表示最大连接数为 100,超时为 15 秒,并且生命周期为 0。这意味着该机器上的应用程序可以处理 100 个连接。
话虽如此,我无法弄清楚为什么我会收到“连接请求超时”。错误,错误代码=-1000,当我的应用程序最多可以创建 100 个连接(根据默认连接池的设置),但我的数据库只显示很少的连接(当我的应用程序有一个连接和 5 个连接时发生 - 100)。
我会注意到,在回收我的应用程序后,我能够专门解决这个问题,但这已经发生了不止一次,所以这不是解决这个问题的方法......
这是我缺少的东西吗?
我的应用程序实际上是否使用了比我看到的更多的连接?
*更新: 我在调试过程中发现有许多线程卡在 Oracle.DataAccess 的“PopulatePool”方法中,而许多其他线程卡在“WaitForRegularConnection”方法中......
【问题讨论】:
-
这种情况是间歇性发生还是一直发生?
-
间歇性发生...每隔几个小时就会在我的服务器上发生这种情况。
-
请启用调试跟踪并分享信息。 TraceLevel 2(连接池统计)就足够了。 docs.oracle.com/cd/B28359_01/win.111/b28375/featDebug.htm
-
为了帮助你,我反编译了代码。我希望我从来没有这样做过,太可怕了!!!跟踪是唯一的选择:(
-
您使用的是哪个版本的 ODP.NET?在我们从“较旧的”11.x ODP.NET 驱动程序迁移到较新的 12c 托管驱动程序后,我们遇到了类似的问题。较旧的驱动程序是从普通的 ODP.NET 包安装的(需要安装大量 MB)。我们迁移到了更新的托管驱动程序,我们只需要一个 4 MB 的程序集。现在我们遇到了连接池的严重问题。正如您所说,我们自己并不管理池(这是提供者的东西),但不知何故,它的行为不像以前那样。我们认为新驱动程序没有正确回收池。有人有什么想法吗?
标签: .net oracle iis-7 connection-pooling odp.net