2010-09-02 69 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,以明確釋放對象。

當連接池並未真正關閉連接時關閉連接。它只是將它釋放回池中。我聽說過有關連接池「出錯」的故事,所以也許嘗試禁用它。您也可以爲連接超時指定一個值。

據我所知,這些都可以在應用程序的連接字符串中設置。