Я собираюсь предположить, что прослушиватель 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