标签:
最近在windows下使用通过多线程使用jdbc操作数据库,在线程数设置为5,并且每个线程执行完成后Sleep(1000),在这种情况下,竟然还会报错:
java.net.SocketException No buffer space available (maximum connections reached) JVM_Bind
一看这个错误类型,应该是属于Socket连接没有关闭或者一直在等待,因为我用的是jdbc去操作数据库,并且是短连接的形式,也即每次执行一个操作就新建jdbc连接,操作完毕即关闭jdbc连接,而jdbc连接是基于Socket的,那么问题应该就出现在jdbc连接数据库上面了,再加上我使用的是原声java编写的程序,并没有用任何框架以及web容器,所以并没有jdbc连接池帮我控制jdbc连接的关闭。经过各种尝试和google,发现可能是windows系统级Socket设置的原因。
解决方案如下:
1. 启动注册表编辑器。 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
2. 新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(十进制)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 30(这个表示TIME_WAIT的秒数)
其中最重要的是TCPTimedWaitDelay,如果一个Socket连接等待时间超过30秒,就关闭连接。
再次运行程序,现在将线程数设置为30,程序仍旧能正常运行。
标签:
原文地址:http://www.cnblogs.com/edwinchen/p/4206066.html