web-dev-qa-db-ja.com

Java JDBC - SIDの置き換えにサービス名を使用してOracleに接続する方法

次のように、ホスト名、ポートおよびOracle SIDを使用して開発データベースに接続していたJDBC(JPA経由)を使用するJavaアプリケーションがあります。

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

XYZがOracle SIDでした。 SIDを使用せず、代わりにOracleの "Service Name"を使用する別のOracleデータベースに接続する必要があります。

私はこれを試しましたが、うまくいきません。

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

ABCDは他のデータベースのサービス名です。

何がおかしいのですか?

226
Jim Tough

http://download.Oracle.com/docs/cd/B28359_01/Java.111/b31224/urls.htm#BEIDHCBA

シンスタイルサービス名の構文

シンスタイルのサービス名は、JDBC Thinドライバでのみサポートされています。構文は次のとおりです。

@ //ホスト名:ポート番号/サービス名

例えば:

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)))
394
Bert F

したがって、これを機能させるには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ファイル形式に精通している場合は、これもおなじみのはずです。そうでなければ、詳細についてはそれをグーグルだけ。

87
Jim Tough

以下のように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)))
23

これを試してください:jdbc:Oracle:thin:@Oracle.hostserver2.mydomain.ca:1522/ABCD

編集:これより下のコメントごとに実際に正しいです:jdbc:Oracle:thin:@//Oracle.hostserver2.mydomain.ca:1522/ABCD//に注意してください)

ここに link が役に立つ記事へのリンクです

13
DwB

この議論は私が数日間苦労していた問題を解決するのを助けました。 11月5日18日、15:17にJim Toughが答えを見つけるまで、私はインターネット中を見回しました。その答えで私は接続することができました。今、私は完全な例で他の人に恩返しをしたいと思います。これが行きます:

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);
        }       
    }
}
7
Ed Chipeta

SIDなしでOracleに接続するためにEclipseを使用している場合。選択するドライバは2つあります。つまり、Oracle Thinドライバと他のドライバです。他のドライバを選択し、データベース列にサービス名を入力してください。 SIDなしでサービス名を使って直接接続できるようになりました。

1

dagの代わりにthinを使うとき、サービス名を指す以下の構文は私のために働きました。上記のjdbc:thinの解決策はうまくいきませんでした。

jdbc:dag:Oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
0
Syk Nar

これはうまくいくはずです:jdbc:Oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

0
Kamesh Murali