Ошибка подключения локального хоста Java Oracle (ORA-12505)

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

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 from v$thread; (он возвращает) Экземпляр --> xe

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

Спасибо!

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


person k9b    schedule 24.07.2011    source источник
comment
Что показывает lsnrctl status при запуске с пользователем, которому принадлежит база данных?   -  person Mat    schedule 24.07.2011
comment
Это либо ваша строка подключения, либо файлы конфигурации базы данных.   -  person dkroy    schedule 24.07.2011
comment
Вы используете Oracle Express Edition (XE) или версии Standard/Enterprise?   -  person Vineet Reynolds    schedule 24.07.2011
comment
@Vineet: SID xe предполагает, что он использует Express Edition.   -  person Luke Woodward    schedule 24.07.2011
comment
@ Люк, не обязательно. Он запускает пример, исходя из своего предыдущего вопроса, поэтому xe SID может быть из примера, который он скопировал.   -  person Vineet Reynolds    schedule 24.07.2011
comment
@Vineet: я не знал о его/ее предыдущем вопросе, спасибо, что указали на это. Однако SQL-запрос, который он/она запускает для получения имени экземпляра (первый абзац под трассировкой стека), который возвращает xe, действительно предполагает, что он/она использует XE.   -  person Luke Woodward    schedule 24.07.2011
comment
Я использую экспресс-выпуск 10g, xe был там по умолчанию, я просто использовал его   -  person k9b    schedule 24.07.2011


Ответы (5)


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

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
person Jugal Shah    schedule 24.07.2011
comment
У меня его нет, но есть LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = LENOVO-E04EFE5E)(PORT = 1522)) ) ) DEFAULT_SERVICE_LISTENER = (XE) - person k9b; 24.07.2011
comment
Спасибо за это, у меня была проблема с портом был 1522 вместо 1521, теперь работает. БЛАГОДАРНОСТЬ! - person k9b; 24.07.2011
comment
@ k9b тоже самое! Каково решение тогда? - person Satej; 05.12.2019
comment
Кажется, мой порт был отключен (был 1522 вместо 1521) @Satej - вопрос довольно старый, извините, точно не помню - person k9b; 12.12.2019

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

использовать это:

String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + "/" + sid;

person Sergio    schedule 05.06.2014

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

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

person tarun hasija    schedule 26.08.2013

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

person user3877876    schedule 25.07.2014

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

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

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

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

Исключение в потоке "main" java.sql.SQLRecoverableException: ошибка ввода-вывода: сетевому адаптеру не удалось установить соединение

Если вы получаете сообщение об ошибке 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
person Luke Woodward    schedule 24.07.2011