BindException: Address already in use 错误处理

这两天在整理爱东西网的数据时,写了一个数据库操作程序,需要大批量更新数据(几十万)。(hibernate +spring+mysql)

程序更新数据到几万的时候出错了,报异常 :

java.net.SocketException
MESSAGE: java.net.BindException: Address already in use: connect

STACKTRACE:

java.net.SocketException: java.net.BindException: Address already in use: connect
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)

从错误提示上看是端口被占。

在chinaunix上找到一个哥们的总结:

大概原因是短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间; )

然后哥们也给出了解决方法:

方法有两个,一个是调高你的web服务器的最大连接线程数,调到1024,2048都还凑合,以resin为例,修改resin.conf中的thread-pool.thread_max,如果你采用apache连resin的架构,别忘了再调整apache;
另一个是修改运行web服务器的机器的操作系统网络配置,把time wait的时间调低一些,比如30s。


个人觉得应该是耗尽了数据库链接,或则是数据库链接资源尚未释放,而新的链接请求无法得到,于是出现异常了。

解决:增加数据库链接数,修改端口释放时间(改小),修改代码减少更新频率。

你可能感兴趣的:(java,spring,mysql,.net,socket)