2013-02-08 155 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

相关问题