Java JDBC - SIDではなくサービス名を使用してOracleに接続する方法

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

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は、もう一方のデータベースのサービス名です。

何が間違っているのでしょうか?

ソリューション

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)))
解説 (2)

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)))
解説 (0)

お試しください: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

編集:以下のコメントによると、実際には次のようになります: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD (//に注意)

参考になる記事へのリンクをご紹介します。

解説 (1)