Ошибка подключения 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 ответов:
Проверьте, слушатель ли.файл 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