調査でおおよそ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のSERVICE_NAMEをorcl.localadminにすると正しく接続できます。これわかりづらいよー。tnsnames.oraのSERVICE_NAMEはorclになっているからリスナー側も同じなのかと思っていた。