Java IOException:网络适配器无法建立连接

Java IOException:网络适配器无法建立连接,java,oracle,jdbc,Java,Oracle,Jdbc,在我们的生产环境中,我们不时会遇到“网络适配器无法建立连接”的问题,我在谷歌上做了很多搜索,并在这里讨论了一些问题,但仍然没有找到解决方案 以下是有关我们环境的一些信息: 我们将RAC用于2个oracle实例(版本10.2.0.4) 我们有几个应用服务器(JBossAS5)运行在RAC之上 oracle-ds.xml中的连接url是“jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db1_vip)

在我们的生产环境中,我们不时会遇到“网络适配器无法建立连接”的问题,我在谷歌上做了很多搜索,并在这里讨论了一些问题,但仍然没有找到解决方案

以下是有关我们环境的一些信息:

  • 我们将RAC用于2个oracle实例(版本10.2.0.4)
  • 我们有几个应用服务器(JBossAS5)运行在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=专用)(SERVICE_NAME=G1db)(故障转移模式=(TYPE=SELECT)(方法=BASIC)(重试次数=120)(延迟=5))”
  • 我们将db1_vip/db2_vip以及两个oracle实例的实际ip添加到两个应用服务器的/etc/hosts中
  • oracle实例和应用服务器之间有防火墙,但我们在两个oracle实例上都打开了1521端口
  • 我们已运行以下测试,以检查网络或oracle TNS listener上是否存在任何问题:

  • 从应用服务器到两个oracle实例运行ping,一切正常,没有任何数据包丢失
  • telnet将1521端口从应用程序服务器连接到两个oracle实例,没有问题
  • tnsping也很好用
  • 我们检查了侦听器日志,但没有发现任何有价值的内容
  • 最奇怪的是,这个错误在一台应用服务器上每小时大约发生10次,但在另一台应用服务器上每天只发生1到2次

    有人能解释一下这个错误吗

    谢谢

    [EDIT4]:我们在扫描一个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
    
    java.sql.SQLException:Io异常:网络适配器无法建立连接
    位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
    位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:414)
    位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:165)
    位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
    位于org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:207)
    …还有5个
    
    错误

    java.sql.SQLException:Io异常:网络适配器无法启动 建立连接

    Java/JDBC
    无关。
    这是当您的网络设置出现问题时出现的错误。我猜是防火墙问题。您可以禁用它并查看错误是否仍然存在吗?

    编辑连接并测试它,尽管您的tnsping找到了!(如果使用virtualbox)(在适配器中检查允许全部),在我的例子中,错误是当我使用ip而不是使用localhost时,我们可以做到这一点,但我真的怀疑这是真正的原因,因为这个错误是间歇性发生的,ping和telnet都工作,而另一个应用服务器大部分时间都工作。我明白了,你不能长时间禁用它。我在想,因为它偶尔会发生一次,防火墙可能会丢弃一些tcp/ip数据包,客户端计算机上的tcp堆栈会将其解释为无法连接。但这只是一个假设。我们使用了应用程序服务器和数据库服务器之间的ping,没有发现任何数据包丢失,不确定这是否是最佳方式。我建议您使用Wireshark()查看更多详细信息。我认为jdbc错误消息太笼统了。我们使用了wireshark,没有发现任何可疑信息~这只是一个提示:我在x64上的java7出现了网络错误。如果您使用的是java7,请尝试版本6。我们在两个应用服务器上都使用jdk5。尝试使用db服务器的ip地址,而不是主机名;如果这样做没有任何问题,请尝试使用失败后,您可以将问题缩小到dns主机名解析。我们将主机名更改为ip地址,但仍然可以看到这种情况。。