2013-02-08 186 views
0

我有一個應用程序可以同時連接到SQL和Oracle數據庫。 Oracle連接多次拋出此異常。我做了搜索,發現這個鏈接Oracle ORA-12542:TNS:地址已經在C#中使用了

http://www.forumtopics.com/busobj/viewtopic.php?p=925784

它看起來像在Windows .NET問題以下

「[使用錯誤ORA-12542 TNS地址]造成因描述事實上,在Windows客戶端的空閒端口已經用盡,它正在嘗試使用處於TIME_WAIT狀態的端口,該端口給出錯誤TNS-12542:地址已在使用中。「

我的問題是:

1>是否有可能在.NET指定本地端口範圍進行連接,例如,其中一個端口範圍全身心地投入到SQL服務器的連接和端口到Oracle的另一範圍。

2>端口如何分配給.Net中的連接?所以,Time_Wait端口將不會被重新分配。

3>對於oracle連接,我的本地端口分配的端口號從非常高的數字開始,例如50000,但使用SQL Server連接時,我的本地端口從5000開始。爲什麼會這樣?

4>如何解決這個問題?

在此先感謝。

編輯:我們在SQLServer連接中也遇到超時異常。我認爲他們是相關的。

+1

您使用了多少個端口?看起來你沒有正確關閉你的連接。 – Ben 2013-02-11 10:15:13

+0

@Ben,大約50個端口用於SQLSever連接,10個用於Oracle連接,這不是一個非常大的數字。但是,Time_Wait狀態下的端口數量非常高,SQLSever連接數大約爲800,而Oracle數最多爲200。 – Helic 2013-02-12 16:28:42

+0

你在使用連接池嗎?聽起來好像你可能關掉了它。系統應該爲大多數場景重用連接。或者,如果每個連接字符串不同(或在不同的用戶上下文中),連接池將無效。 – Ben 2013-02-12 16:43:23

回答

0

如果將連接池關閉並且臨時端口耗盡,則可能會出現此問題。使用連接池可以減少滿足相同請求吞吐量所需的連接數量,並可能解決問題。

本地端口的使用通常僅限於特定範圍,即使對於短暫端口,也可以更容易識別流量並管理防火牆規則。

因爲連接是相對昂貴的操作,所以連接池通常適用於數據庫連接。出於這個原因,重用連接是很好的。

,爲什麼這是阻止您連接,您可能想看看這個:

也許MaxUserPorts已被修改爲一個非默認值?默認情況下,應該有3976個可用端口,允許3976個同時連接到相同的遠程IP地址/端口組合。 (如果遠程端是相同的,則該端口必須是唯一的 - 組合remoteIP:port plus localIP:port必須是唯一的)。

或者,某些組件管理自己的本地端口分配而不是委託給操作系統,因此SqlConnection的情況可能如此。

+0

非常感謝您的信息。 maxuserport在我的註冊表中被設置爲默認值。我沒有跟蹤.net源代碼,但沒有找到端口分配代碼的位置。我認爲這是一個本地窗口dll來做到這一點。 – Helic 2013-02-18 11:28:05

相關問題