1

我想用 java 连接到 Oracle 8i 数据库,其中数据库位于本地网络 10.3.1.1 的服务器上的端口

我已按照示例教程从 Oracle 网站建立连接

https://docs.oracle.com/html/A67296_01/im_examp.htm#997347

我也按照这里指定的说明 https://people.cs.pitt.edu/~chang/156/06oracle/jdbc.html

您可能需要这些详细信息:

  • Oracle 8i 数据库端口 1521
  • 在 Windows Server 2003 ip 10.3.1.1 上运行的本地网络服务器
  • IP 10.3.1.2 机器上的 java 版本“1.8.0_152”
  • 添加了 classes12.zip 文件以构建路径

这是我的 Java 代码:

package com.oracle8i.testconnect;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnect {
    public Connection connection;

    public DBConnect() {
        // TODO Auto-generated constructor stub
    }

    public void connect() throws Exception {
        String connectString;
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connectString = "jdbc:oracle:thin:@10.3.1.1:1521:dbname";
        System.out.println("Before DriverManager.getConnection");
        try {
            connection = DriverManager.getConnection(connectString, "username", "password");
            System.out.println("Connection established");

            connection.setAutoCommit(false);
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("Exception inside connect(): " + e);
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DBConnect client = new DBConnect();

        System.out.println("beginning");
        try {
            client.connect();
            System.out.println("after Connected");

            client.connection.close();

            System.out.println("after close");

        } catch (Exception e) {
            // TODO: handle exception
            try {
                System.out.println("Exception : " + e);
                client.connection.close();
                e.printStackTrace();
            } catch (Exception ex) {
                // TODO: handle exception
                System.out.println("Close Connection Exception : " + ex);
                ex.printStackTrace();
            }
        }

    }

}

我收到此错误消息:

beginning
Before DriverManager.getConnection
Exception inside connect(): java.lang.ArrayIndexOutOfBoundsException: 4
java.lang.ArrayIndexOutOfBoundsException: 4
    at oracle.jdbc.driver.T4C8TTIdty.<init>(T4C8TTIdty.java:491)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1434)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:711)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:558)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.oracle8i.testconnect.DBConnect.connect(DBConnect.java:19)
    at com.oracle8i.testconnect.DBConnect.main(DBConnect.java:37)
after Connected
Exception : java.lang.NullPointerException
Close Connection Exception : java.lang.NullPointerException
java.lang.NullPointerException
    at com.oracle8i.testconnect.DBConnect.main(DBConnect.java:48)

我在互联网上寻找解决方案,但没有什么对我有用

这些是我的测试和结果:

  • 使用错误的数据库名称(SID)进行测试

我已经测试用错误的名称更改数据库名称(sid)以检查它是否连接,幸运的是,它似乎与 oracle 的连接几乎正确,因为它响应了这个错误

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:711)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:558)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.oracle8i.testconnect.DBConnect.connect(DBConnect.java:19)
    at com.oracle8i.testconnect.DBConnect.main(DBConnect.java:37)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:272)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    ... 8 more
  • 检查数据库监听器

我已经向管理员检查了监听器状态并且它正在运行(系统正在运行)

数据库监听器

  • 禁用防火墙

我已禁用防火墙

在此处输入图像描述 在此处输入图像描述

更新 1:添加 listener.ora 内容

# LISTENER.ORA Network Configuration File: D:\ORACLE\ORA8I\network\admin\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = svrstn01)(PORT = 1521))
      )
    )
    (DESCRIPTION =
      (PROTOCOL_STACK =
        (PRESENTATION = GIOP)
        (SESSION = RAW)
      )
      (ADDRESS = (PROTOCOL = TCP)(HOST = svrstn01)(PORT = 2481))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\ORACLE\ORA8I)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = SITEEN)
      (ORACLE_HOME = D:\ORACLE\ORA8I)
      (SID_NAME = SITEEN)
    )
  )
4

1 回答 1

0

我在虚拟基础架构上安装了一个测试站点。

  • 服务器:Windows 2003 SP2 32 位
  • 服务器:Oracle 8.1.7.0
  • 客户端:windows 7 32位
  • 客户端:java 1.8.0_73
  • 客户端:Oracle 客户端 9.2.0.1
  • 客户端:C:\oracle\ora92\jdbc\lib 中 Oracle 客户端 9.2.0.1 中的 classes12.jar

用不同版本的jdbc驱动测试:

使用不同的 connectString 进行测试:

  • connectString ="jdbc:oracle:thin:@10.89.251.123:1521:ORCL";
  • connectString ="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.89.251.123)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))";
  • connectString = "jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.89.251.123)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))";
  • connectString = "jdbc:oracle:oci:@ORCL8";

测试从 Oracle 客户端 9.2.0.1 连接到 DB 8.1.7.0 SID=ORCL

C:\oracle\ora92\network>sqlplus scott@orcl8

SQL*Plus: Release 9.2.0.1.0 - Production on Tue Dec 26 13:44:11 2017

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Enter password:

Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

connected> select * from v$version;



     ----------------------------------------------------------------
        Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
        PL/SQL Release 8.1.7.0.0 - Production
        CORE    8.1.7.0.0       Production
        TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
        NLSRTL Version 3.4.1.0.0 - Production

    Elapsed: 00:00:00.00
    connected>

监听器.ora

LISTENER.ORA 网络配置文件:C:\oracle\ora81\network\admin\listener.ora 由Oracle配置工具生成。
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 10.89.251.123)(PORT = 1521))
      )
    )
    (DESCRIPTION =
      (PROTOCOL_STACK =
        (PRESENTATION = GIOP)
        (SESSION = RAW)
      )
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.89.251.123)(PORT = 2481))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oracle\ora81)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ORCL)
      (ORACLE_HOME = C:\oracle\ora81)
      (SID_NAME = ORCL)
    )
  )

Oracle 客户端 9.2 中的 TNSNAMES.ORA 文件

### TNSNAMES.ORA Network Configuration File: 
### Generated by Oracle configuration tools.

ORCL8 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.89.251.123)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCL)
    )
  )

这是您的 Java 代码:( 瘦 jdbc->oracle 服务器)

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnect {
    public Connection connection;

    public DBConnect() {
        // TODO Auto-generated constructor stub
    }

    public void connect() throws Exception {
        String connectString;
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connectString = "jdbc:oracle:thin:@10.89.251.123:1521:ORCL";
        System.out.println("Before DriverManager.getConnection");
        try {
            connection = DriverManager.getConnection(connectString, "scott", "tiger");
            System.out.println("Connection established");

            connection.setAutoCommit(false);
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("Exception inside connect(): " + e);
            e.printStackTrace();
        }

    }

public static void main(String[] args) {
    // TODO Auto-generated method stub
    DBConnect client = new DBConnect();

    System.out.println("beginning");
    try {
        client.connect();
        System.out.println("after Connected");

        client.connection.close();

        System.out.println("after close");

    } catch (Exception e) {
        // TODO: handle exception
        try {
            System.out.println("Exception : " + e);
            client.connection.close();
            e.printStackTrace();
        } catch (Exception ex) {
            // TODO: handle exception
            System.out.println("Close Connection Exception : " + ex);
            ex.printStackTrace();
        }
    }

}

}

测试连接成功!!!

C:\Program Files\Java\jdk1.8.0_73\bin>javac.exe  DBConnect.java


C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Connection established
after Connected
after close

在 Oracle 服务器 c:\oracle\ora81\network\log\listener.log 上的文件 listener.log 文件中记录连接

26-DEC-2017 14:03:53 * (CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.88.164.45)(PORT=54225)) * establish * ORCL * 0

将瘦驱动程序更改为 oci (jdbc->oracle 客户端库->oracle 服务器)

public void connect() throws Exception {
    String connectString;
    Class.forName("oracle.jdbc.driver.OracleDriver");
    connectString = "jdbc:oracle:oci:@ORCL8";
    System.out.println("Before DriverManager.getConnection");
    try {
        connection = DriverManager.getConnection(connectString, "scott", "tiger");
        System.out.println("Connection established");

        connection.setAutoCommit(false);
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("Exception inside connect(): " + e);
        e.printStackTrace();
    }

}



C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Connection established
after Connected
after close

在 Oracle 服务器 c:\oracle\ora81\network\log\listener.log 上的文件 Listener.log 文件中记录连接

26-DEC-2017 14:14:11 * (CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=C:\Program Files\Java\jdk1.8.0_73\bin\java.EXE)(HOST=IVC-PTK-DEMIN)(USER=DeminDV))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.88.164.45)(PORT=54424)) * establish * ORCL * 0

我继续使用不同版本的 jdbc 驱动程序进行测试。 http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

9.2.0.1、8.1.7.0、10.2.0.5版本已经顺利通过测试。 版本 11.1.0.5、11.2.0.4、12.1.0.2、12.2.0.1 未通过测试。

**http://download.oracle.com/otn/utilities_drivers/jdbc/10205/classes12.jar
classes12.jar (1,621,582 bytes) - for use with JDK 1.2 and JDK 1.3**



 C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
    beginning
    Before DriverManager.getConnection
    Connection established
    after Connected
    after close

    http://download.oracle.com/otn/utilities_drivers/jdbc/10205/ojdbc14.jar
    ojdbc14.jar (1,569,316 bytes) - classes for use with JDK 1.4 and 1.5
    C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
    beginning
    Before DriverManager.getConnection
    Connection established
    after Connected
    after close

http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

**http://download.oracle.com/otn/utilities_drivers/jdbc/111070/ojdbc6.jar
ojdbc6.jar (1,988,051 bytes) - Classes for use with JDK 1.6. It contains the JDBC** 

C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Exception inside connect(): java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 7
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1611)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496)
        at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at DBConnect.connect(DBConnect.java:20)
        at DBConnect.main(DBConnect.java:38)
after Connected
Exception : java.lang.NullPointerException
Close Connection Exception : java.lang.NullPointerException
java.lang.NullPointerException
        at DBConnect.main(DBConnect.java:49)


**http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar
ojdbc6.jar (2,739,670 bytes) - (SHA1 Checksum: a483a046eee2f404d864a6ff5b09dc0e1be3fe6c)
Certified with JDK 8, JDK 7 and JDK 6: It contains the JDBC driver** 

C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Exception inside connect(): java.lang.ArrayIndexOutOfBoundsException: 4
java.lang.ArrayIndexOutOfBoundsException: 4
        at oracle.jdbc.driver.T4C8TTIdty.<init>(T4C8TTIdty.java:488)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1199)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at DBConnect.connect(DBConnect.java:20)
        at DBConnect.main(DBConnect.java:38)
after Connected
Exception : java.lang.NullPointerException
Close Connection Exception : java.lang.NullPointerException
java.lang.NullPointerException
        at DBConnect.main(DBConnect.java:49)

**http://download.oracle.com/otn/utilities_drivers/jdbc/121020/ojdbc7.jar
ojdbc7.jar (3,397,734 bytes) - (SHA1 Checksum: a2348e4944956fac05235f7cd5d30bf872afb157)
Certified with JDK 7 and JDK 8; It contains the JDBC driver** 

C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Exception inside connect(): java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 7
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1611)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496)
        at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at DBConnect.connect(DBConnect.java:20)
        at DBConnect.main(DBConnect.java:38)
after Connected
Exception : java.lang.NullPointerException
Close Connection Exception : java.lang.NullPointerException
java.lang.NullPointerException
        at DBConnect.main(DBConnect.java:49)


**http://download.oracle.com/otn/utilities_drivers/jdbc/122010/ojdbc8.jar
ojdbc8.jar (4,036,257 bytes) - (SHA1 Checksum: 60f439fd01536508df32658d0a416c49ac6f07fb) 
Certified with JDK 8; It contains the JDBC driver**

C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  . DBConnect
beginning
Before DriverManager.getConnection
Exception inside connect(): java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 7
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1548)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
        at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at DBConnect.connect(DBConnect.java:20)
        at DBConnect.main(DBConnect.java:38)
after Connected
Exception : java.lang.NullPointerException
Close Connection Exception : java.lang.NullPointerException
java.lang.NullPointerException
        at DBConnect.main(DBConnect.java:49)
于 2017-12-26T11:17:41.393 回答