今天,遇到一个问题,
由于Wimdows默认不设置 MaxUserPort 在注册表的Tcpip 参数中。
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
本台机器如果试图创建太多连接的话,这往往导致“The Network Adapter could not establish the connection” “Address already in use” 错误,
解决方法:设置 MaxUserPort = 65534
参考:
MaxUserPort 值指定在应用程序向系统请求可用的用户端口时,TCP 可以分配的最高端口号。通常,为临时端口分配的端口号为 1024 到 5000。
默认情况下,Microsoft Windows Server™ 2003 将 MaxUserPort 值设置为 5000。Microsoft Windows® 2000 不将 MaxUserPort 值添加到注册表中。可以手动将 MaxUserPort 值添加到注册表中。
MaxUserPort 描述:确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。 停止并重新启动系统。 缺省值:无 建议值:至少十进制 32768。
做了这么久的数据库开发,这里留点我对ORACLE端口的掌握,ORACLE各版本默认端口均是1521,可以修改,但是ORACLE9I的WINDOWS版,使用了动态端口技术,装上后默认的是动态端口模式,如果需要改成静态端口,则只需要在HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0下增加一个名为use_shared_socket的字符串键,键值为true,保存后重新启动ORACLE服务即可。
动态端口和静态端口有什么区别呢,静态端口,就是说,不管你来多少请求连接,我都是不断的开无数个1521端口上的连接给你,动态就是只有前一个是1521,后面就从1024-5000开临时端口给你。
那么,不管是哪种模式,只要消耗完了系统的临时端口,就会让ORACLE的远程连接出现暂时的当机,甚至造成操作系统的崩溃。
这主要是由于操作系统的临时端口不够用而引起的。一般windows系统的临时端口为1024-5000,由于每个链接断开以后,还要有一个等待时间,例如在windows系统中,这个时间默认是240秒。这就导致了一个现象:一会可以联通,一会TNSPING的时候又出现 TNS-12542: TNS: 地址已被占用(ora-12542 address in used。)
如果有临时端口可以使用,可以联通oracle;如果暂时端口没有了,就连不通了
TNS-12542: TNS: 地址已被占用
问题描述:
执行 tnsping 命令提示:TNS-12542: TNS: 地址已被占用
应用中报错:
java.sql.SQLException: Io 异常: The Network Adapter could not establish the conn
ection
在WINDOWS下可以缓解的办法:
1. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。(超过30秒自动销毁已经断开的连接)
缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
2. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。缺省值:无 建议值:至少十进制 32768,最大65534,这个对动态端口有用,用来表示最大可以分配到的端口号
修改保存后重启机器。