SQL*PlusとJDBC Thinドライバの接続文字列は異なるので気をつけましょう。

調査でおおよそ2日間ぐらい無駄にしてしまったので、同じ事象でハマっている方の手助けになれば。
listenerのステータスを確認して、以下の状態だったとする。

$ lsnrctl status listener
- 途中省略 -
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
Services Summary...
Service "orcl.localadmin" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.localadmin" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

JDBCドライバの接続文字列が「jdbc:oracle:thin:@192.168.1.100:1521:ORCL」となっているので、SQL*Plusで以下のコマンドを実行する。

sqlplus uid/pwd@localhost:1521/orcl

SQL*Plus: Release 11.2.0.1.0 Production on Wed Feb 24 16:46:40 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


Enter user-name:

なんとリスナーが存在しないと言われてしまう・・・(localhostは192.168.1.100と思ってください)。これまで、JDBCドライバ側はちゃんと繋がっていたのに!なんで〜?
そこでステータスを確認した時にServiceが「orcl.localadmin」となっていることに気づく。どこでlocaladminなんてくっついたんだろ・・・。tnsnames.oraのSERVICE_NAMEはorclになっているし・・・。

散々調べた結果、SQL*PlusとJDBCドライバでは接続文字列にしていするものが違うようです。

  • SQL*Plus
    UID/PWD@HOST:PORT/SERVICE_NAME
  • JDBCドライバ
    jdbc:oracle:thin:@HOST:PORT:SID

SQL*PlusのSERVICE_NAMEをorcl.localadminにすると正しく接続できます。これわかりづらいよー。tnsnames.oraのSERVICE_NAMEはorclになっているからリスナー側も同じなのかと思っていた。

というわけで、SQL*PlusとJDBCドライバでは指定する文字列が異なるので気をつけましょう。