Do Not Think!!!

Posted
Filed under 글로 기록하기
지난 4월 5일 (목)요일 정통부에서 작업 할 당시, 발생한 에러입니다. 그런데 오늘 국방부에서 작업하는데 똑같은 에러가 발생하네요.

물론 정통부에서 작업 할 때에는, 다른 문제 때문이었었는데, 그때에도 문제를 해결하는 과정에서 오늘 발생한 문제에 대한 내용을 봤었습니다. 그때에는 다른 문제라 생각하고 그냥 지나쳤었는데, 오늘 이 에러를 접하고 나니, 바로 정리하지 못한 아쉬움이 남네요.


시스템은 그림에서 보이는 것 처럼 구성되어 있습니다.
  1. Client 와 WAS는 CORBA로 연결됩니다.
  2. WAS와 DB는 다른 네트워크에 존재합니다.
현상은 다음과 같습니다.
  1. Client <-----> DB 2-티어로 잘 연결됩니다.
  2. Client <-----> WAS <-----> DB 3-티어로는 DB에 연결이 되지 않습니다.
에러 로그는 다음과 같습니다.
Caused by: java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)


그림 보기



이런 에러가 발생하는 이유로는 네트워크로 데이터베이스에 접근하지 못하는 문제인데,
  1. 리스너가 안떠있거나
  2. 호스트명이 잘못되어있거나
  3. 방화벽문제
인 경우가 대부분입니다.

실제 웹에서 검색을 해보면, 1번과 2번 때문에 이런 문제가 발생한다는 것과, 그에대한 해결방법에 대해 많이 찾을 수 있었습니다. 하지만 2-티어로는 접속이 잘 되고 있는 상황이기 때문에, 다른 원인을 찾아야만 했는데, 그래서 찾은 원인은 Oracle이 Multithreaded Server (MTS)로 설정되어 있을 경우 ORA-17002 (ORA-12505) 문제가 발생한다는 것입니다.

해결방법으로는 다음과 같은 접속 URL 대신에
JDBC Thin 드라이버 Orcle 접속 URL (Language : java)
"jdbc:oracle:thin:@<HOST>:<PORT>:<SID>"

다음 URL을 사용합니다.
Multithreaded Server (MTS)가 설정된 Oracle에 접속하기 위한 JDBC Thin 드라이버 Oracle 접속 URL (Language : java)
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<HOST>(PORT=<PORT>)))(CONNECT_DATA=(SERVICE_NAME=<SID>)(SERVER=DEDICATED)))"

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (IO 예외 상황: The Network Adapter could not establish the connection)at org.apache.commons.dbcp.BasicDataSource.createD