【问题标题】:Oracle connections exhausted by IISIIS 耗尽的 Oracle 连接
【发布时间】:2010-09-02 15:55:16
【问题描述】:

我们的 Oracle (9i) DBA 打电话给我报告说我的 IIS (v6) Web 服务器已用尽可用连接。

我创建了一个测试页面(经典 ASP),它基本上创建 ADODB.Connection 和 ADODB.Recordset 对象、连接到数据库、打开基本记录集、循环通过它、关闭记录集和连接并将对象设置为空。这是 Web 服务器上的大多数应用程序所做的。

在与 DBA 交谈时,我打开了测试网页。 DBA 能够看到我连接并记录了 ID(我假设这个 ID 帮助他跟踪连接)。页面加载完毕,因此两个对象的 Close 方法都发生了

DBA 说连接仍然显示,即使我关闭了浏览器。

我认为最终连接消失了,因为应用程序池回收了。

所以我的问题是:这正常吗?调用 Close 方法后连接不应该消失吗.. 或者至少会话关闭?

我不确定这是否有用甚至相关,但我们已经在我们的网络服务器上的事件查看器中定期看到这些错误:

Event Type: Information
Event Source:   Application Error
Event Category: (100)
Event ID:   1004
Date:       7/21/2010
Time:       7:34:20 AM
User:       N/A
Computer:   VMADE02
Description:
Reporting queued error: faulting application w3wp.exe, version 6.0.3790.3959, faulting module orantcp9.dll, version 9.2.0.6, fault address 0x00005741.

【问题讨论】:

    标签: asp-classic iis-6 ado oracle9i


    【解决方案1】:

    “页面加载完毕,所以两个对象的Close方法肯定都发生了。”

    “必须”实际上并非如此。垃圾收集器在应用程序内存不足时运行(并执行您的 COM 对象的析构函数),或者当它有一些时间可以杀死时。每次 IIS 完成页面服务时,这些情况都不能保证发生。 Raymond Chen 最近写了一篇关于what garbage collection actually means, as opposed to what people think it means 的好文章。他说的是.NET,但同样的原则也适用于此。垃圾收集尝试模拟无限的内存供应。它对 Oracle 的了解还不够,无法尝试模拟无限供应的 Oracle 连接。

    您只需要显式调用 Close()。

    在 .NET 中,您可以使用“使用”块,它模拟 C++ 样式的堆栈对象 RIIA 语义。但这对经典的 ASP 没有帮助。

    【讨论】:

    • 对不起.. 我不清楚。测试应用程序确实调用了连接对象的 close 方法(并将其设置为空),但根据 oracle 和 DBA,即使在浏览器关闭后连接仍然存在(关闭浏览器并不重要)。我将更改提交中的措辞.. 谢谢。
    【解决方案2】:

    我不确定这篇文章是否真的有用,因为 COM 使用引用计数机制而不是 CLR 垃圾收集器模型。这就是他将对象设置为 Nothing 以显式释放对象的原因。

    在连接池实际上并没有关闭连接时关闭连接。它只是将其释放回池中。我听说过有关连接池“出错”的故事,所以也许可以尝试禁用它。您还可以为连接超时指定一个值。

    据我所知,这两个都可以在应用程序的连接字符串中设置。

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      • 2013-09-11
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多