Java JDBC-SIDの代わりにサービス名を使用してOracleに接続する方法


251

次のように、ホスト名、ポート、Oracle SIDを使用して開発データベースに接続していた(JPA経由の)JDBCを使用する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:port_number / service_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形式に関するポイントを組み込んで、回答を完成させることはできますか?
アリスターリー

私にとっては、@では機能しませんでした。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

したがって、これを機能させるには2つの簡単な方法があります。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 2013年

したがって、ここではIPを使用できますoracle.hostserver2.mydomain.caか?
ベンジャミン

8

この議論は、私が何日も苦労していた問題を解決するのに役立ちました。11月5日18: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

Eclipseを使用してSIDなしでOracleに接続している場合。選択するドライバーは2つあります。つまり、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

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.