我们的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.
答案 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以显式释放对象的原因。
当连接池实际上没有关闭连接时关闭连接。它只是将它释放回池中。我听说有关连接池“出错”的故事,所以也许尝试禁用它。您还可以为连接超时指定值。
据我所知,这两个都可以在应用程序的连接字符串中设置。