Java JDBC-SID 대신 서비스 이름을 사용하여 Oracle에 연결하는 방법


251

호스트 이름, 포트 및 Oracle SID를 사용하여 개발 데이터베이스에 연결하는 JDBC (JPA를 통해)를 사용하는 Java 응용 프로그램이 있습니다.

jdbc : oracle : thin : @ oracle.hostserver1.mydomain.ca : 1521 : XYZ

XYZ는 Oracle SID였습니다. 이제 SID를 사용하지 않고 Oracle "서비스 이름"을 사용하는 다른 Oracle 데이터베이스에 연결해야합니다.

나는 이것을 시도했지만 작동하지 않습니다 :

jdbc : oracle : thin : @ oracle.hostserver2.mydomain.ca : 1522 : ABCD

ABCD는 다른 데이터베이스의 서비스 이름입니다.

내가 뭘 잘못하고 있죠?

답변:


427

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

씬 스타일 서비스 이름 구문

Thin 스타일 서비스 이름은 JDBC Thin 드라이버에서만 지원됩니다. 구문은 다음과 같습니다.

@ // host_name : 포트 _ 번호 / 서비스 _ 이름

예를 들면 다음과 같습니다.

jdbc : oracle : thin : scott / tiger @ // myhost : 1521 / myservicename

그래서 시도 할 것입니다 :

jdbc : oracle : thin : @ // oracle.hostserver2.mydomain.ca:1522/ABCD

또한 Robert Greathouse의 답변에 따라 JDBC URL에서 아래와 같이 TNS 이름을 지정할 수 있습니다.

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))

@Robert Greathouse의 답변 당 TNSNAMES 형식에 대한 요점을 통합하여 답변을 완성 할 수 있습니까?
Alister Lee

나를 위해 @와 함께 작동하지 않았기 때문에 jdbc : oracle : thin : // myhost : 1521 / myservicename을 사용해야했지만 사용자 자격 증명도 제공하지 않았습니다.
Daniel

Google App Script에서 JDBC 씬 드라이버를 사용하여 Oracle에 연결하는 방법을 알아 내려고 노력했지만 많은 구문을 시도하지 않았습니다. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAME또는 jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME에 대한 인수로 사용자 이름과 비밀번호를 사용합니다 jdbc.getConnection(). 여전히 수수께끼입니다.
벤자민

92

이 작업을 수행하는 두 가지 쉬운 방법이 있습니다. Bert F가 게시 한 솔루션은 다른 특정 Oracle 관련 연결 속성을 제공 할 필요가 없으면 제대로 작동합니다. 그 형식은 다음과 같습니다.

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

그러나 다른 Oracle 특정 연결 속성을 제공해야하는 경우 긴 TNSNAMES 스타일을 사용해야합니다. 최근 서버에서 자체 연결 풀링을 수행하는 Oracle 공유 연결을 활성화하기 위해이 작업을 수행해야했습니다. TNS 형식은 다음과 같습니다.

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

Oracle TNSNAMES 파일 형식에 익숙하면 익숙 할 것입니다. 그렇지 않은 경우 Google에서 세부 정보를 제공합니다.


24

아래와 같이 JDBC URL에 TNS 이름을 지정할 수도 있습니다.

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(HOST=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))

17

이 시도: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

편집 : 아래 주석마다 실제로 맞습니다 : jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(참고 //)

유용한 기사에 대한 링크 는 다음과 같습니다.


3
이것은 나를 위해 작동하지 않았다, 나는 사용해야했다 jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB

IP 대신 여기에서 IP를 사용할 수 oracle.hostserver2.mydomain.ca있습니까?
벤자민

8

이 토론은 내가 며칠 동안 고투하던 문제를 해결하는 데 도움이되었습니다. Jim Tough가 5 월 18 일 11시 15 분 17 초에 답변을 찾을 때까지 인터넷 전체를 둘러 보았습니다. 그 대답으로 나는 연결할 수있었습니다. 이제 저는 완전한 예를 들어주고 다른 사람들을 돕고 싶습니다. 간다 :

import java.sql.*; 

public class MyDBConnect {

    public static void main(String[] args) throws SQLException {

        try { 
            String dbURL = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=whatEverYourHostNameIs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=yourServiceName)))";
            String strUserID = "yourUserId";
            String strPassword = "yourPassword";
            Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword);

            Statement sqlStatement = myConnection.createStatement();
            String readRecordSQL = "select * from sa_work_order where WORK_ORDER_NO = '1503090' ";  
            ResultSet myResultSet = sqlStatement.executeQuery(readRecordSQL);
            while (myResultSet.next()) {
                System.out.println("Record values: " + myResultSet.getString("WORK_ORDER_NO"));
            }
            myResultSet.close();
            myConnection.close();

        } catch (Exception e) {
            System.out.println(e);
        }       
    }
}

1

SID없이 오라클을 연결하기 위해 일식을 사용하는 경우. 선택할 수있는 두 가지 드라이버가 있습니다. 즉, Oracle thin 드라이버와 다른 드라이버입니다. 다른 드라이버를 선택하고 데이터베이스 열에 서비스 이름을 입력하십시오. 이제 SID없이 서비스 이름을 사용하여 직접 연결할 수 있습니다.


더 중요하게는 Thin Driver와 달리 연결 URL을 완전히 지정할 수 있습니다. 재미있는 점은 여전히 ​​씬 드라이버 URL을 사용하여 작동하게하는 것입니다 (JDBC 씬 드라이버에서만 지원되는 씬 스타일 서비스 이름). 많은 예제가 여기에 게시되었습니다.
Edi Bice

0

dag대신에 사용하면 thin서비스 이름을 가리키는 아래 구문이 효과적이었습니다. jdbc:thin위 의 솔루션은 작동하지 않았습니다.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME

1
작동하지 않았거나 작동하지 않은 것에 대해 좀 더 자세히 설명하는 정보를 추가하십시오. 이것이 왜 작동하는지 관찰했거나 알고 있습니까?
AJD

1
주목할 점은 특정 드라이버를 사용하고 있다는 것입니다. Oracle의 씬 드라이버 리턴을 사용하려고 시도 함 : jdbc : dag : oracle : //에 적합한 드라이버를 찾을 수 없음
access_granted

0

이것은 작동해야합니다 : jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME


1
오류 : "잘못된 Oracle URL이 지정되었습니다", 11g / ojdbc7 조합.
access_granted
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.