JDBC URL(Oracle Database, Thin)の作り方

JDBC URL(Oracle Database, Thin)の作り方を書いてみるやで彡(ﾟ)(ﾟ)

# 1. JDBCマニュアルの記述

マニュアルの記述は以下の通り。

 > 8.2 データベースURLとデータベース指定子
 > https://docs.oracle.com/cd/E96517_01/jjdbc/data-sources-and-URLs.html#GUID-C4F2CA86-0F68-400C-95DA-30171C9FB8F0
 > データベースURLは文字列です。完全なURL構文は、次のとおりです。
 > jdbc:oracle:driver_type:[username/password]@database_specifier
 > 　  
 > 8.2.4 Thin形式のサービス名の構文
 > https://docs.oracle.com/cd/E96517_01/jjdbc/data-sources-and-URLs.html#GUID-EF07727C-50AB-4DCE-8EDC-57F0927FF61A
 > Thin形式のサービス名は、JDBC Thinドライバでのみサポートされます。構文は次のとおりです。
 > @//host_name:port_number/service_name

なお上記の記述は簡易接続(EZCONNECT)そのものなので、簡易接続のマニュアルもリンクしとく彡(ﾟ)(ﾟ)

 > 8.1 簡易接続ネーミング・メソッドの理解
 > https://docs.oracle.com/cd/E96517_01/netag/configuring-naming-methods.html#GUID-B0437826-43C1-49EC-A94D-B650B6A4A6EE
 > CONNECT username@[//]host[:port][/service_name][:server][/instance_name]

原則としてホスト名／ポート番号／サービス名の3つを指定すれば、JDBC URLを作成できます。
これらを管理するのはリスナーなので、まずリスナーの役割を簡単に解説。

# 2. リスナーの役割

リスナーはサーバー上に常駐するプロセスで、クライアントからの接続要求を
リスニングして、Oracle Database への接続を管理／許可するプロセスです。

専用サーバー接続の例ですが、リスナーの動作は下記の記事が解り易いです。

 > コネクションとは？
 > https://www.oracle.com/technetwork/jp/articles/chapter5-1-101584-ja.html#p01b

リスナーは1組以上のホスト名(IPアドレス)／ポート番号が定義されていて、
そのリスナーにデータベース・サービスが動的に登録されます。

lsnrctl status <リスナー名>コマンドを実行すると、ホスト名(IPアドレス)／ポート番号や
登録されているデータベース・サービスが確認できます。以下はサンプル彡(ﾟ)(ﾟ)

```sql
$ lsnrctl status LISTENER

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 30-APR-2019 23:39:27
:
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))) ★ホスト名とポート番号
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8081))(Presentation=HTTP)(Session=RAW))
:
Services Summary...
Service "64a52f53a7683286e053cda9e80aed76" has 1 instance(s). ★リスナーに登録されたサービス
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "784ac9d638bb5f59e0530100007f6047" has 1 instance(s). ★リスナーに登録されたサービス
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "AYSTEST" has 1 instance(s).                          ★リスナーに登録されたサービス
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).                             ★リスナーに登録されたサービス
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "orclcdb" has 2 instance(s).                          ★リスナーに登録されたサービス
  Instance "orclcdb", status UNKNOWN, has 1 handler(s) for this service...
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
Service "orclcdbXDB" has 1 instance(s).                       ★リスナーに登録されたサービス
  Instance "orclcdb", status READY, has 1 handler(s) for this service...
The command completed successfully
```

# 3. データベース・サービスとは？

データベース・サービスとは、Oracle Database のワークロード(負荷)を識別し易くするために、
論理的な別名を付与したものとなります。1つの Oracle Database環境に複数サービスを作成可能です。

以下の記事が分かり易いですやで彡(ﾟ)(ﾟ)

 > 第3回 ネットワーク経由で接続
 > https://www.oracle.com/technetwork/jp/database/articles/kusakabe/kusakabe-3-4490049-ja.html
 > 4.2 サービス
 > Oracle8までは…(中略)…Oracleインスタンス識別子であるSIDでした …(中略)…
 > Oracle Database 10gではサービスの概念が拡張され、ワークロードを抽象化する概念となりました …(中略)…
 > 追加されたサービスは、動的サービス登録の仕組みによってOracleリスナーに登録されます。

JDBC URL／tnsnames.ora／簡易接続(EZCONNECT)など、接続先としてこのデータベース・サービス名を記述します。

# 4. サンプル1：sqlclでJDBC URLを指定しつつ接続確認

sqlcl(SQL Developerのコマンドライン版)で、JDBC URLのサンプルを書いてみるやで彡(ﾟ)(ﾟ)
上記 2. の AYTESTサービスに接続してみます。このケースの JDBC URL は下記の通り

 > jdbc:oracle:driver_type:[username/password]@//host_name:port_number/service_name
 > ↓
 > jdbc:oracle:thin:@//0.0.0.0:1521/AYTEST

実行サンプルを下記に示します。CONNECTコマンドのユーザ名直後の@マーク以降がJDBC URLです。
sqlcl の SHOW JDBCコマンドでも JDBC URL は確認できます。

```sql
cd /home/oracle/sqldeveloper/sqldeveloper/bin
./sql /nolog
CONNECT AYSHIBAT@jdbc:oracle:thin:@//0.0.0.0:1521/AYSTEST
SHOW JDBC

SQLcl: Release 18.3 Production on Wed May 01 01:06:43 2019

Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Password? (**********?) ********
Connected.

-- Database Info --
Database Product Name: Oracle
:
-- Driver Info --
Driver Name: Oracle JDBC driver
Driver Version: 18.3.0.0.0
Driver Major Version: 18
Driver Minor Version: 3
Driver URL: jdbc:oracle:thin:@//0.0.0.0:1521/AYSTEST ★JDBC URL
:
```

# 5. サンプル2：OCI DB(DBaaS)のCDBにsqlclでJDBC URLを指定しつつ接続

OCI(Oracle Cloud Infrastructure) DB(DBaaS) の CDB に sqlcl JDBC URLで接続するサンプルを書いてみます彡(ﾟ)(ﾟ)
下記記事のサンプルを流用してみるやで。

 > OCI Database(DBaaS) の PDB に sqlplus で接続してみる。(Oracle Cloud Infrastructure)
 > https://gonsuke777.hatenablog.com/entry/2019/02/19/211953
 > ：
 > 管理サービス(CDB)への接続文字列(簡易接続)：
 > dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_cdb32r.subnetname.vcnname.oraclevcn.com
 > ：

上記ケースの JDBC URL は 下記の通りとなります。

 > jdbc:oracle:driver_type:[username/password]@//host_name:port_number/service_name
 > ↓
 > jdbc:oracle:thin:@//dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_cdb32r.subnetname.vcnname.oraclevcn.com

sqlclによる接続サンプルは下記の通り彡(ﾟ)(ﾟ)

```sql
./sql /nolog
CONNECT SYSTEM@jdbc:oracle:thin:@//dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_iad32r.subnetname.vcnname.oraclevcn.com
SHOW JDBC;

Password? (**********?) ********
Connected.

-- Database Info --
Database Product Name: Oracle
:
-- Driver Info --
Driver Name: Oracle JDBC driver
Driver Version: 12.2.0.1.0
Driver Major Version: 12
Driver Minor Version: 2
Driver URL: jdbc:oracle:thin:@//dbname.subnetname.vcnname.oraclevcn.com:1521/dbname_iad32r.subnetname.vcnname.oraclevcn.com ★JDBC URL
:
```

# 6. サンプル3：Autonomous DB(ATP/ADW)の場合のJDBC URL

Autonomous DB(ADW/ATP)の場合のJDBC URLは下記記事を参照彡(ﾟ)(ﾟ)

 > Autonomous DB(ADW/ATP) に Java の JDBC Thin Driver で接続してみる。(OCI, Oracle Cloud Infrastructure)
 > https://gonsuke777.hatenablog.com/entry/2019/02/26/023534

何かしらの方法でウォレットの格納場所をTNS_ADMINに指定します。
JDBC URL に TNS_ADMIN を直接記述するやり方だと、下記の通り彡(ﾟ)(ﾟ)

 > 4. 方法1:ウォレットのパス(TNS_ADMIN) を JDBC URL に記述
 > https://gonsuke777.hatenablog.com/entry/2019/02/26/023534#4-%E6%96%B9%E6%B3%951%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E3%83%91%E3%82%B9TNS_ADMIN-%E3%82%92-JDBC-URL-%E3%81%AB%E8%A8%98%E8%BF%B0  
 > ：  
 > ★下記がJDBC URL  
 > jdbc:oracle:thin:@xxxxxx_high?TNS_ADMIN=/home/opc/app/opc/product/18.0.0/client_1/network/admin  
 > ：  

結果は記事を見てね。

# 7. サンプル4：tnsnames.oraっぽい書き方でJDBC URLを記述

[マニュアル](https://docs.oracle.com/cd/E96517_01/jjdbc/data-sources-and-URLs.html#GUID-6F729E4D-064B-4FD9-AE92-1BD44B8BE5EF)にも記載が有るとおり、
JDBC URLはtnsnames.oraっぽく書くこともできる。下記はそのサンプル彡(ﾟ)(ﾟ)

```sql
※実際には1行で記述
jdbc:oracle:thin:@
(DESCRIPTION_LIST=
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=dbname.subnetname.vcnname.oraclevcn.com)(PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=dbname_iad32r.subnetname.vcnname.oraclevcn.com))
  )
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=dbname-scan.subnetname.vcnname.oraclevcn.com)(PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=dbname_iad32r.subnetname.vcnname.oraclevcn.com))
  )
)
```
sqlclでの接続サンプルは下記の通り彡(ﾟ)(ﾟ) コマンドながーい。

```sql
./sql /nolog
CONNECT SYSTEM@jdbc:oracle:thin:@(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbname_iad32r.subnetname.vcnname.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=aysdb121_iad1rn.sub12070931430.vcnname.oraclevcn.com)))(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbname-scan.subnetname.vcnname.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dbname_iad32r.subnetname.vcnname.oraclevcn.com))))
SHOW JDBC

SQLcl: Release 19.1 Production on Wed May 01 06:20:39 2019

Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Password? (**********?) ***************
Connected.

-- Database Info --
Database Product Name: Oracle
:
-- Driver Info --
Driver Name: Oracle JDBC driver
Driver Version: 18.3.0.0.0
Driver Major Version: 18
Driver Minor Version: 3
Driver URL: jdbc:oracle:thin:@(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbname_iad32r.subnetname.vcnname.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=aysdb121_iad1rn.sub12070931430.vcnname.oraclevcn.com)))(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbname-scan.subnetname.vcnname.oraclevcn.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dbname_iad32r.subnetname.vcnname.oraclevcn.com))))
:
```

# 8. まとめ

上記 7. みたいな書き方が出来ちゃうから、評判が悪いのかしら彡(ﾟ)(ﾟ)

ここら辺は[Oracle MAA(Maximum Availability Architecture)](https://www.oracle.com/technetwork/jp/database/features/availability/maa-094615-ja.html)の一環、
接続時フェイルオーバーとかクライアント・サイド・ロードバランスとかで
こうなっていると認識しているので、ご理解頂くよう要努力ですかね(ﾟεﾟ )

とまれ、簡易接続(EZCONNECT)さえ理解してれば恐れるに足らず！
どんどん接続(?)してくれやで彡(^)(^)

# おまけ. サンプル：Autonomous DB(ATP/ADW) に sqlclで接続

sqlclの場合はset cloudconfigコマンドでウォレットを指定します。下記が参考になります。

 > Oracle Cloud：Autonomous DatabaseにSQLcl接続してみてみた
 > https://qiita.com/shirok/items/86355be72a47a840d10e

set cloudconfigした後の JDBC URL は下記の通り、あら何か複雑彡(ﾟ)(ﾟ)

```sql
./sql /nolog
set cloudconfig /home/opc/app/opc/product/18.0.0/client_1/network/admin/Wallet_aysatp01.zip
CONNECT ADMIN@aysatp01_low
SHOW JDBC


SQLcl: Release 19.1 Production on Wed May 01 05:58:28 2019

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

Operation is successfully completed.
Operation is successfully completed.
Using temp directory:/tmp/oracle_cloud_config4416493815228189719
Password? (**********?) *************
Connected.

-- Database Info --
Database Product Name: Oracle
:
-- Driver Info --
Driver Name: Oracle JDBC driver
Driver Version: 18.3.0.0.0
Driver Major Version: 18
Driver Minor Version: 3
Driver URL: jdbc:oracle:thin:@(description= (address=(protocol=tcps)(port=1522)(host=xxxx.xxxx.xxxxxxxx.com))(connect_data=(service_name=xxxxxx_low.xxxx.xxxxxxxx.com))(security=(ssl_server_cert_dn="CN=xxxx.xxxx.xxxxxxxx.com,OU=…,O=…,L=…,ST=…,C=…"))   )
:
```