java.net.NoRouteToHostException: 无法指定被请求的地址/Cannot assign requested address出现的原因及解决方案

这篇博客主要讨论了Java应用程序在尝试建立数据库连接时遇到的`NoRouteToHostException`问题。错误日志显示由于无法指定被请求的地址导致连接失败。提出了两种可能的解决方案:一是调整TCP/IP配置以降低TIME_WAIT状态端口等待时间和增加可用端口范围;二是优化系统设置以减少端口冲突。这些方法旨在解决网络连接资源限制和端口耗尽的问题。
摘要由CSDN通过智能技术生成

java.net.NoRouteToHostException: 无法指定被请求的地址
报错日志:

2021-08-09 14:13:42.083[WARN ][C3P0PooledConnectionPoolManager[identityToken->z8kfltajbiyq6d98bpde|6fa82685]-HelperThread-#0][c.m.v.r.BasicResourcePool:214] com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@132433b1 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
com.thunisoft.ArteryBase.util.PSQLException: The connection attempt failed.
	at com.thunisoft.ArteryBase.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:240)
	at com.thunisoft.ArteryBase.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
	at com.thunisoft.ArteryBase.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:143)
	at com.thunisoft.ArteryBase.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
	at com.thunisoft.ArteryBase.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
	at com.thunisoft.ArteryBase.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:38)
	at com.thunisoft.ArteryBase.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
	at com.thunisoft.ArteryBase.Driver.makeConnection(Driver.java:412)
	at com.thunisoft.ArteryBase.Driver.connect(Driver.java:280)
	at net.sf.log4jdbc.sql.jdbcapi.DriverSpy.connect(DriverSpy.java:399)
	at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
	at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
	at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
	at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.net.NoRouteToHostException: 无法指定被请求的地址
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at com.thunisoft.ArteryBase.core.PGStream.<init>(PGStream.java:61)
	at com.thunisoft.ArteryBase.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:110)
	... 18 common frames omitted
可能解决方法1--调低time_wait状态端口等待时间:
  1. 调低端口释放后的等待时间,默认为60s,修改为15~30s
    sysctl -w net.ipv4.tcp_fin_timeout=30
  2. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0,修改为1,释放TIME_WAIT端口给新连接使用
    sysctl -w net.ipv4.tcp_timestamps=1
  3. 修改tcp/ip协议配置,快速回收socket资源,默认为0,修改为1
    sysctl -w net.ipv4.tcp_tw_recycle=1

可能解决办法2–增加可用端口:
CCH:~ # sysctl -a |grep port_range
net.ipv4.ip_local_port_range = 50000 65000 -----意味着50000~65000端口可用

修改参数:
$ vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000 65000 -----意味着10000~65000端口可用

改完后,执行命令“sysctl -p”使参数生效,不需要reboot。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值