今天同事发来一个错误:
java.net.SocketException: No buffer space available (maximum connections reached?): recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)(文章来源 www.pms.cc)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1960)
来自于mysql的一个异常,开始是怀疑是mysql的连接数问题。查了下是发现大量的close_wait的状态,应该是端口没用完了。
因此调了下mysql的连接数,第二是让调下TIME_WAIT状态的回收时间。这个时间默认是240S。如下:
1、my.ini里面加连接:max_connections=1000
2、修改Windows的参数:
1.启动注册表编辑器。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
2. 新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以,如果是十六进制,是FFFE,因为4个F是65535嘛)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
3.新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,不行可以用WINDOWS计算器,很方便,这个表示TIME_WAIT的秒数)(文章来源 www.pms.cc)
之前java做多线程条用数据库忘记把connection关掉就导致了连接数供给不上的情况,每个线程用完都关掉就没有什么问题了。