IOException:网络适配器无法建立连接[重复]
Posted
技术标签:
【中文标题】IOException:网络适配器无法建立连接[重复]【英文标题】:IOException: Network adapter could not establish the connection [duplicate] 【发布时间】:2012-09-25 07:38:14 【问题描述】:我们的生产环境开始时不时出现这个“网络适配器无法建立连接”的问题,我做了很多谷歌并在这里遇到了一些问题,但仍然没有得到解决方案。
以下是有关我们环境的一些信息:
-
我们正在使用带有 2 个 oracle 实例(版本 10.2.0.4)的 RAC。
我们有几个应用服务器 (JBoss AS5) 在 RAC 上运行。
oracle-ds.xml中的连接url是“jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = db1_vip)(PORT = 1521))(ADDRESS = ( PROTOCOL = TCP)(HOST=db2_vip)(PORT = 1521))(LOAD_BALANCE = yes))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = G1db)(FAILOVER_MODE =(TYPE =SELECT)(METHOD = BASIC)(RETRIES = 120)(延迟 = 5))))"
我们将 db1_vip/db2_vip 以及 2 个 oracle 实例的实际 ip 添加到两个应用服务器的 /etc/hosts 中
oracle 实例和应用服务器之间存在防火墙,但我们在两个 oracle 实例上都打开了 1521 端口。
我们已经运行了以下测试来检查网络或 oracle TNS 监听器是否有任何问题:
-
从应用服务器运行 ping 到两个 oracle 实例,一切正常,没有任何数据包丢失。
从应用服务器远程登录 1521 端口到两个 oracle 实例,没有错。
tnsping 也可以正常工作。
我们检查了监听器日志,但没有发现任何有价值的东西。
最奇怪的是,这个错误在一个应用服务器上每小时发生大约 10 次,但在另一个应用服务器上每天只发生 1 或 2 次。
谁能解释一下这个错误?
谢谢
[EDIT4]:我们在tnsping一个oracle实例时发现超时问题,所以我们改变jdbc url只连接一个实例,发现IOException再也没有发生过,所以我们认为问题与数据库和DBA 团队将继续对此进行调查。
[EDIT3]:我们做了以下尝试:
-
禁用应用服务器和数据库服务器之间的防火墙
使用 ip 代替主机名
使用wireshark检查是否有tcp数据包问题。
都没有成功,求大神帮忙~
[编辑]:错误堆栈跟踪:
java.sql.SQLException: Io Exception: The Network Adapter could not establish the connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:207)
... 5 more
【问题讨论】:
它只是一个提示:我在 x64 上使用 java7 时遇到网络错误。如果您使用的是 java7,请尝试版本 6。 我们在两个应用服务器上都使用 jdk5。 尝试使用db服务器的ip地址代替主机名;如果这没有任何故障,那么您可以将问题缩小到 dns 主机名解析。 我们将主机名更改为 ip 地址,仍然看到这种情况发生.. 【参考方案1】:错误
java.sql.SQLException:Io 异常:网络适配器无法 建立连接
与Java/JDBC
无关。
这是您在网络设置出现问题时遇到的错误。我的猜测,防火墙问题。您可以禁用它并查看错误是否仍然存在?
【讨论】:
我们可以做到,但我真的怀疑这是否是真正的原因,因为此错误以间歇方式发生,ping 和 telnet 都可以正常工作,而另一个应用服务器大部分时间都可以正常工作。 我明白了,你不能再禁用它了。我在想,因为它偶尔会发生,防火墙可能会丢弃一些 tcp/ip 数据包,这会被客户端机器上的 tcp 堆栈解释为无法连接。但这只是一个假设。 我们确实使用了应用服务器和数据库服务器之间的 ping 并没有发现任何数据包丢失,不确定这是否是最好的方法。 我建议你使用 Wireshark (wireshark.org) 来查看更多细节。我觉得 jdbc 错误信息太笼统了。 我们使用了wireshark,没有发现任何可疑之处~【参考方案2】:编辑连接并测试它,虽然你的 tnsping 找到了!,如果使用 virtualbox(在适配器中检查全部允许),在我的情况下,错误是当我使用 ip,而不是使用 localhost
【讨论】:
以上是关于IOException:网络适配器无法建立连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLRecoverableException:网络适配器无法建立连接