IIS连接的Oracle连接

时间:2010-09-02 15:55:16

标签: asp-classic iis-6 ado oracle9i

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

我创建了一个测试页面(Classic 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.

2 个答案:

答案 0 :(得分:0)

“页面已完成加载,因此必须发生两个对象的Close方法。”

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

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

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

答案 1 :(得分:0)

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

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

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