【问题标题】:ODP.NET Connection request timed outODP.NET 连接请求超时
【发布时间】: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


【解决方案1】:

注意 Oracle 调用,发送了哪些查询以执行,连接超时不取决于连接池最大计数,您的请求永久服务于一个连接。记录您的请求,然后尝试模拟它们,检查 DB 中的执行持续时间。

【讨论】:

    【解决方案2】:

    您的经历可能是您的服务器负载因某种原因而变得过大,导致处理新查询需要花费太多时间。

    1. 如果可以,请查看服务器的加载日志,了解在您遇到超时时服务器上可能发生的情况。如果您只使用服务器托管此数据库(更好的选择),请参阅第二个选项

    2. 也有可能您的应用程序使用的包会慢慢地使 SGA 过度拥挤,并且由于会话未被撤销,因此占用了过多的资源。所以一个解决方案是跟踪这个“持久”的会话,看看它在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2013-03-24
      相关资源
      最近更新 更多