解决windows系统因TCP端口不足导致mysql数据库无法访问的问题

在windows服务器上面批量处理数据的时候,遇到下面的异常,意思是说连接数用完了,无法再建立连接。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.

For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
    at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

默认情况下,Windows 允许用于使用5000 个临时(短命)TCP 端口。任何端口关闭后,它将在TIME_WAIT 状态保持120 秒。与重新初始化全新的连接相比,该状态允许以更低的开销重新使用连接。 但是,在该时间逝去前,无法再次使用该端口。
对于小的可用TCP 端口堆栈(5000 ),以及具有TIME_WAIT 状态的大量在短时间内打开和关闭的 TCP 端口,你很可能遇到端口耗尽问题。
我们可以通过修改注册表配置来解决问题:
1,启动注册表编辑器(Regedt32.exe )。

2,在注册表中确定下述键值的位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单上点击“添加值”,然后增加下述注册值:
Value Name: MaxUserPort
Data Type: REG_DWORD
Value: 65534
它用于设置为任何用户提供的临时端口数。有效范围介于5000 和65534 之间(十进制)。默认值为0x1388 (5000 ,十进制)。

3,在“编辑”菜单上点击“添加值”,然后增加下述注册值:
Value Name: TcpTimedWaitDelay
Data Type: REG_DWORD
Value: 30
它用于设置关闭之前将TCP 端口连接保持在TIME_WAIT 状态的秒数。 有效范围介于0 秒和300 秒之间。默认值为0x78 (120 秒)。

4,退出注册表编辑器。

5,重启服务器。