环境:
数据库服务器与java程序不在同一个子网。
现状:
1.sqlplus可以连接
2.java程序无法连接
报错如下:
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 java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
3.抓包发现,数据包超时重传,重传失败后报2中的异常信息
4.oracle数据库所在机器防火墙未开启
5.不是网上所说连接池的问题,该应用未使用数据库连接池
6.jdbc驱动正常请高手进来指导。

解决方案 »

  1.   

    这个应该不是程序问题,我这代码连接多台服务器都是不同的子网段,你看看代码的连接地址,首先能PING通,代码改用用IP地址或者机器名连接试试。
      

  2.   

    ip是通的,没有用机器名,用的就是真实的ip地址
      

  3.   

    需要说明下,oracle所在的机器是台虚拟机,不知道是否有影响
      

  4.   

    Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection(url, user, pwd);
                String sql = "select * from tbl_drp_role t";
                PreparedStatement ps = conn.prepareStatement(sql);
                ps.executeQuery();
                ResultSet rs = ps.getResultSet();
                while(rs.next()){
                    String str = rs.getString(1);
                    System.out.println(str);
                }
      

  5.   

    就要看你的url,你直接省略了。
      

  6.   

    String url = "jdbc:oracle:thin:@172.30.62.190:1521:orcl";
      

  7.   

    楼主你好,java连接数据库,首先要在odbc数据源上建个驱动源,然后测试数据源时否成功创建,然后通过这段代码经行连接:
      try
                   {
                    try
                    {
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                    }
                    catch (ClassNotFoundException e)
                    {
                    System.out.println("SQLException:"+e.getMessage());
                    System.err.println("ClassNotFoundException"+e.getMessage());
                    }
                    con=DriverManager.getConnection(url, user,password);
                    System.out.println("ok,数据库已经成功连接");
                    DatabaseMetaData dme=con.getMetaData();
                    System.out.println("所连接的数据库的url:"+dme.getURL());
                    System.out.println("此数据库的用户名:"+dme.getUserName());
                   
                   }
                   catch (SQLException e)
                   {
                    System.out.println("SQLException:"+e.getMessage());
                   }
                 
      

  8.   

    telnet 172.30.62.190 1521返回啥
      

  9.   

    ip是对的,但是毕竟抓包发现超时重传了。所以考虑,是否是数据库实例名错误,此处就是orcl。或者数据监听端口错误。
      

  10.   

    数据库实例名没有问题,相同的 String url = "jdbc:oracle:thin:@172.30.62.190:1521:orcl";
    在同一网段的机器上该程序就可以运行
      

  11.   


    正常,监听没有问题,否则即便在相同网段的机器上部署该程序一样报错,但实际情况是在同一网段的机器上跑该程序没有问题
    出错时提示信息:Software caused connection abort: recv failed 
      

  12.   


    用的驱动就是数据库 jdbc/lib下的ojdbc14.jar,不是最新的,只要是数据库自身带的驱动就应该可以吧?
    驱动和数据库应该是匹配的,数据库是在oracle官网上下载的安装的
      

  13.   

    再不同的网段的机器上可以通过sqlplus连接吗
    如果可以检查一下tns里的ip,port和servicename和你程序中使用的相同吗
      

  14.   


    可以sqlplus连接,tns配置的ip,port servicename都一样。
    tnsping ip 是ok的
      

  15.   

    LZ试试把java程序放到虚拟机上,看能不能连上数据库。我前些天也出这个问题了,我的是日志服务器放在虚拟机上,相互能ping通,但是怎么都连不上......到现在也没解决。还有LZ是怎么测试的,是不是同一台虚拟机,只是IP改动一下,结果就不同?
      

  16.   

    你用MySQL试下,有没有同样的问题出现;如果没有,那说明
    服务Oracle中的相关Oracle相关程序没有开启,或者是突然断了
      

  17.   


    oracle server安装在一台虚拟机上,java程序在我自己的机器上
      

  18.   

    关闭防火墙,杀毒软件,内外网不是主要原因。下载个ssh软件,看看能连上不
      

  19.   


    ssh能连上,我快崩溃了,不知道什么原因
      

  20.   

    曾经用sqlserver,死活不能连上,后来发现数据库服务器的windows自带防火墙没关,关闭之后问题就解决了
      

  21.   


    服务器防火墙没开,oralce 1521端口是通的
      

  22.   

    真是奇怪,jdbc:oracle:thin:@172.30.62.190:1521/orcl就行,凑合着用吧。
      

  23.   

    卧槽,lZ我遇到和你一样的问题了,oracle 11g装在虚拟机上,同一网段jdbc可以获得conn,无任何问题,本地是另一网段,ping,tnsping ,telent,pl/sql(能连上) 都可以,本地就是用jdbc获得不了连接,报:java.sql.SQLRecoverableException: IO 错误: Software caused connection abort: recv failed
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at crl.ibm.com.test.DbConnUtil.<clinit>(DbConnUtil.java:23)
    Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at oracle.net.ns.Packet.receive(Packet.java:300)
    at oracle.net.ns.DataPacket.receive(DataPacket.java:106)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:385)
    ... 7 more
    null
    TMD,我快死了,多种oracle
    的连接方式都试过,thin,service_name 方式都试过,草草草。服务端监听的是hostname,大神求救...