Ошибка локального хоста Java Oracle (ORA-12505) - PullRequest
3 голосов
/ 24 июля 2011

Я пытаюсь подключиться к базе данных на моем текущем компьютере.

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

public class Main {
    public static void main(String[] argv) throws Exception {

        Connection connection = null;
        try {
            // Load the JDBC driver
            String driverName = "oracle.jdbc.driver.OracleDriver";
            Class.forName(driverName);

            // Create a connection to the database
            String serverName = "localhost";
            String portNumber = "1521";
            String sid = "xe";
            String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
            String username = "scott";
            String password = "tiger";
            connection = DriverManager.getConnection(url, username, password);
            System.out.println("Success");
        } catch (ClassNotFoundException e) {
            System.out.println("Class Not Found Error");
        } 
    }
}

Я получаю эту ошибку, и я не знаю, почему ...

Exception in thread "main" 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
The Connection descriptor used by the client was:
localhost:1521:xe

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:496)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Main.main(Main.java:21)

На своем сервере я использовал команду (вошел в систему как sys) SQL> select instanceот v $ thread;(возвращается) Экземпляр -> xe

Что я могу сделать неправильно?

Спасибо!

PS Я также пробовал 127.0.0.1 вместо localhost

Ответы [ 5 ]

4 голосов
/ 05 июня 2014

Вместо String url = "jdbc: oracle: thin: @" + serverName + ":" + portNumber + ":" + sid;

используйте это:

String url ="jdbc: oracle: thin: @" + имя_сервера + ":" + номер_порта + "/" + sid;

4 голосов
/ 24 июля 2011

Проверьте, имеет ли файл listener.ora в каталоге <ORACLE_HOME>\admin\NETWORK следующее значение:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
2 голосов
/ 26 августа 2013

замените xe именем базы данных, которое вы установили во время установки, вы обязательно получите успех

если вы забыли имя dbname, его можно получить из файла tnsnames.ora в вашем каталоге oracle

1 голос
/ 25 июля 2014

Я столкнулся с той же проблемой при подключении к Oracle RAC. Я изменил URL с port:servicename на port/servicename, и у меня это сработало.

0 голосов
/ 24 июля 2011

Я собираюсь предположить, что прослушиватель TNS запустился, но экземпляр базы данных запустился раньше, чем прослушиватель.

Когда экземпляр базы данных запустится, он зарегистрируется в прослушивателе TNS.Однако, если нет слушателя для регистрации, он не может этого сделать.Когда слушатель запускается, он не проверяет, запущены ли экземпляры, о которых он знает.

Я могу предоставить демонстрацию.Я использую Oracle 11g XE Beta в Windows 7. Первоначально служба OracleServiceXE работает, а служба OracleXETNSListener - нет.

Я запустил код подключения к вашей базе данных и получил следующую ошибку:

Исключение в потоке "main" java.sql.SQLRecoverableException: IO Error: Сетевой адаптер не может установить соединение

Если вы получаете ошибку ORA-12505, то, очевидно, ваш TNSСлушатель работает.

Затем я запустил прослушиватель TNS и повторно запустил код подключения к вашей базе данных.На этот раз я получил следующий вывод: (Я переименовал ваш класс и изменил имя пользователя и пароль внутри него, но кроме этого код внутри него тот же):

C:\Users\Luke\stuff>java DbConnTest
Exception in thread "main" 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
[stacktrace snipped]

(Эта ошибкане совпадает с вашим: у меня не было раздела The Connection descriptor used by the client was:. Я не уверен на 100%, почему.)

В приведенном выше случае исправление подключается к SQL * Plus какSYS и запустить ALTER SYSTEM REGISTER.Это регистрирует экземпляр с прослушивателем:

C:\Users\Luke\stuff>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Beta on Sun Jul 24 11:13:57 2011

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> alter system register;

System altered.

SQL> exit
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

После этого я смог подключиться к базе данных:

C:\Users\Luke\stuff>java DbConnTest
Success
...