Ошибка подключения Java Oracle localhost (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> выберите экземпляр из потока v$; (он возвращается) Пример--> xe

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

Спасибо!

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

5 3

5 ответов:

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

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Вместо Строки URL = "JDBC для:оракул:тонкий:@" + имясервера + ":" + номер_порта + ":" + Сид;

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

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

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

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

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

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

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

Я могу предоставить демонстрацию. Я использую Oracle 11g XE Beta на 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