Thinドライバ用のJDBC URL

問題

OracleJDBC URLは、jdbc:oracle:driver_type:[username/password]@database_specifierという形式になっています。
なので、Type4ドライバ(Thinドライバ)の場合、以下のような書き方をしていると思います。

jdbc:oracle:thin:@hogehoge

この場合のhogehogeが何かと言うと、SIDです。
もしもSERVICE_NAMEしか通知されていない場合、上記と同じ書き方をしてしまうとORA-12505エラーが発生します。

対策

データベース指定子(database_specifier)の内容を踏まえた場合、以下の方法が考えられます。

  1. 管理者にSIDを確認する。
  2. データベース指定子に、接続記述子を記述する。
  3. データベース指定子に、Thin形式のサービス名を記述する。
  4. データベース指定子に、TNSNames別名を記述し、TNSNAMES.ORAを参照させる。

なお、以下、ホスト名=foo.bar.com、サービス名=hogehoge.bazとします。

対策1:管理者にSIDを確認する。

省略

対策2:データベース指定子に、接続記述子を記述する。

TNSNAMES.ORAに書いてある接続記述子を、全部記述する方法です。
改行/字下げ/空白は不要なので削除した方が良いかも。
だいたいこんな感じで。

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=foo.bar.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hogehoge.baz)))

実際試して、問題なく繋がった事に感動しましたw

OTNのOTN Japan - 404 Errorに、同様の記述があります。
また、実際に試してはいませんが、RACを使っている場合でも、
データベース指定子の「Thinの場合。」や、RAC構成のOracleへthinドライバで接続するためのJDBC URL - お仕事の備忘録みたいなもののように記述する事で対応可能な模様。

対策3:データベース指定子に、Thin形式のサービス名を記述する。

Thin形式のサービス名というのがあって、下記のような書式だそうです。

//host_name:port_number/service_name

なので、実際に書くとこんな感じ。

jdbc:oracle:thin:@//foo.bar.com:1521/hogehoge.baz

対策4:データベース指定子に、TNSNames別名を記述し、TNSNAMES.ORAを参照させる。

試してません。
TNSNames別名の構文の通りにやると出来る模様。以下抜粋。

System.setProperty("oracle.net.tns_admin", TNSNAMES.ORAのあるディレクトリのパス);
String url = "jdbc:oracle:thin:@tns_entry";

結論

一番楽だし安全そうな対策3が良いかと思います。
対策4はファイルに依存するのが気持ち悪いので、どうせやるなら対策2の方が良いような。

2012-02-08追記
host:port:sid構文?を使うのが一般的。

jdbc:oracle:thin:@foo.bar.com:1521:hogehoge.baz

JDBC - Oracle FAQ