ORA-12505, TNS: прослушиватель в настоящее время не знает SID, указанного в дескрипторе подключения в приложении Tomcat через некоторое время

Я смотрю на веб-приложение, которое использует JDBC Connection для подключения к базе данных Oracle 11g (11.2.0). Приложение какое-то время (около часа) работает без проблем, после чего получаю:

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

Я попытался перезапустить Oracle и службы Oracle OracleServiceXE и OracleXETNSListener, но ошибка не исчезла. Он исчезает только после перезагрузки машины.

Я не менял никаких параметров базы данных в своем Tomcat или Oracle.

Вот мой tnsnames.ora

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

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

ORACLR_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
    ) 
    (CONNECT_DATA = 
      (SID = CLRExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 

Вот моя конфигурация для JDBC:

    String serverName = "localhost";
    String portNumber = "1521";
    String sid = "xe";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
    String username = "xxx";
    String password = "yyy";

Когда «XE» работает правильно, если я проверю статус lsnrctl, я увижу

Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully

Как только я получаю исключение, я не вижу экземпляр «xe», когда проверяю статус lsnrctl.

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


person user203617    schedule 03.02.2016    source источник


Ответы (1)


URL-адрес базы данных должен быть таким, как показано ниже.

// Create DataSource and connect to the local database
ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:5221/orcl");
ods.setUser("HR");
ods.setPassword("hr");
conn = ods.getConnection();

Рекомендуется использовать длинную форму URL-адреса подключения, как показано здесь. jdbc:oracle:thin:@(DESCRIPTION= (АДРЕС=(ПРОТОКОЛ=tcp)(HOST=myhost-vip)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))

Кроме того, чтобы проверить, правильно ли сформирован URL-адрес подключения, получите подключение от разработчика SQL, используя приведенное ниже, и протестируйте его.

sqlplus hr/hr@"(DESCRIPTION= (АДРЕС=(ПРОТОКОЛ=tcp)(HOST=myhost-vip)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))"

person Nirmala    schedule 04.02.2016