2010-09-02 73 views
0

我们的Oracle(9i)数据库管理员呼吁我报告我的IIS(v6)Web服务器已耗尽可用连接。IIS耗尽的Oracle连接

我创建了一个基本上创建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

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

“必须”实际上并非如此。垃圾回收器运行(并执行COM对象的析构函数),当应用程序内存不足时,或者需要一些时间来终止时。每次IIS完成服务页面时,都不会保证发生这些情况。雷蒙德最近写了一篇关于what garbage collection actually means, as opposed to what people think it means的好文章。他在谈论.NET,但这里适用相同的原则。垃圾收集尝试模拟无限的内存供应。它不太了解Oracle如何模拟Oracle连接的无限供应。

你只需要明确地调用Close()。

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

+1

对不起..我不清楚。测试应用程序DOES会调用连接对象的close方法(并将其设置为空),但即使在浏览器关闭(而不是关闭浏览器应该重要)之后,连接依然保留在oracle和DBA中。 我会改变提交的措辞..谢谢。 – carny666 2010-09-02 16:17:28

+0

谢谢,我现在明白了。 – 2010-09-02 16:42:25

0

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

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

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