Asp classic IIS耗尽Oracle连接

Asp classic IIS耗尽Oracle连接,asp-classic,iis-6,ado,oracle9i,Asp Classic,Iis 6,Ado,Oracle9i,我们的Oracle(9i)DBA打电话给我,报告我的IIS(v6)web服务器已耗尽可用连接 我创建了一个测试页面(经典ASP),它基本上创建了ADODB.Connection和ADODB.Recordset对象,连接到数据库,打开一个基本记录集,在其中循环,关闭记录集和连接,并将对象设置为nothing。这就是web服务器上的大多数应用程序所做的 在与DBA交谈时,我打开了测试网页。DBA能够看到我已连接并记录了ID(我假设该ID有助于他跟踪连接)。页面已完成加载,因此,两个对象的关闭方法均已

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

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

在与DBA交谈时,我打开了测试网页。DBA能够看到我已连接并记录了ID(我假设该ID有助于他跟踪连接)。页面已完成加载,因此,两个对象的关闭方法均已发生

DBA说即使在我关闭浏览器后,连接仍在显示

最终连接消失了,我想是因为应用程序池被回收了

所以我的问题是:这正常吗?调用Close方法后,连接是否应消失。。或者至少会议结束了

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

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.
页面已完成加载,因此,两个对象都必须使用Close方法

事实并非如此。当应用程序内存不足或有时间消磨时,垃圾收集器会运行(并执行COM对象的析构函数)。这两种情况都不能保证每次IIS完成页面服务时都会发生。陈雷蒙最近写了一篇很好的文章。他说的是.NET,但同样的原则也适用于这里。垃圾收集试图模拟无限的内存供应。它对Oracle了解不够,无法尝试模拟无限量的Oracle连接

您只需显式调用Close()


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

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

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


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

对不起。。我不清楚。测试应用程序确实调用了connection对象的close方法(并将其设置为nothing),但根据oracle和DBA的说法,即使在浏览器关闭后,连接仍然保持不变(关闭浏览器并不重要)。我将更改提交文件中的措辞。。谢谢