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

来源:互联网 发布:徐老师淘宝店衣服 编辑:程序博客网 时间:2024/06/05 01:52
** BEGIN NESTED EXCEPTION **

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)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2555)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1485)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.saic.projectlewis.harvester.DbConnector.getConnection(DbConnector.java:39)
    at com.saic.projectlewis.harvester.HarvesterToDb.checkHash(HarvesterToDb.java:307)
    at com.saic.projectlewis.harvester.HarvesterToDb.jobFileCollected(HarvesterToDb.java:246)
    at com.bat.harvester.ProcessorThread.a(Unknown Source)
    at com.bat.harvester.ProcessorThread.do(Unknown Source)
    at com.bat.harvester.ProcessorThread.run(Unknown Source)

** END NESTED EXCEPTION **


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

可以考虑增加端口数量来解决,不过你为何不考虑用Socket池呢?让一个Socket重复利用呢?

以下是修改方法
默认最大数量的短暂 TCP 端口为 5000 ' 适用于 ' 部分中包含产品中。 这些产品中已添加新参数。 要增加最大值是短暂端口, 请按照下列步骤操作:
1.
启动注册表编辑器。
2.
注册表, 中找到以下子项, 然后单击 参数 :
HKEY _ LOCAL _ MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3.
在 编辑 菜单, 单击 新建 , 然后添加以下注册表项:
MaxUserPort 值名称:
值类型: DWORD
值数据: 65534
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
说明: 此参数控制程序从系统请求任何可用用户端口时所用最大端口数。 通常, 1024 的值和含 5000 之间分配临时 (短期) 端口。
4.
退出注册表编辑器, 并重新启动计算机。
注意 一个附加 TCPTimedWaitDelay 注册表参数决定多久关闭端口等待可以重用关闭端口。

0 0
原创粉丝点击