WebSphere Liberty - Oracle DB接続

zipファイルを解凍するだけでインストールが完了する、お手軽 JavaEE ランタイム、WebSphere Liberty。
WebSphere Liberty から Oracle に接続したときの、構成方法のログです。

使ったアプリは、ServletからJDBCでOracle DBに接続して、SQL実行結果をJSPに出力するクラシックなもの。
OracleデータベースとJavaSEランタイムは導入済の環境に、Libertyを追加で導入しました。
ここからの手順は最適解でない可能性はありますが、ひとまずこれで出来ました、というメモです。

## WebSphere Libertyのダウンロード
ここからダウンロードするモジュールを選べます。
https://developer.ibm.com/wasdev/downloads/

…Full profile と Web profile の違いって何でしたっけ。(← 残念なレベル感)

https://www.oracle.com/technetwork/java/javaee/tech/index.html
＜--- このページで、WebProfile列にチェックが入っているAPIのみ包含されるのが、Web profile。

Servlet/JSON/JSF/JSP/EJB/JTA/JPA など Webアプリケーション開発で使われる主なAPIは全部入ってるので、Web Profileで十分、機能は足りそうです。

WAS Liberty with Java EE 8 Web Profile
https://developer.ibm.com/wasdev/downloads/#asset/runtimes-wlp-webProfile8
このページから任意のディレクトリに導入イメージ(zip)をダウンロードしておきます。

## WebSphere Liberty のインストール(≒解凍)
ダウンロードしたzipファイルを解凍します。解凍ソフトは何でも良さそうで、今回は7zipを使いました。
ちょっと変なパス名になってしまいましたが、特に困らないのでこのまま使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/1062cffd-7d84-2538-ec59-96b001d0d54e.png)

## アプリケーションの配置
配置先は下記のディレクトリ：
　　　　\<WLP_ROOT>\usr\servers\<server_name>\apps ディレクトリ(※)

複数のアプリケーションサーバ間で共有されるアプリであれば「\<WLP_ROOT>\shared\apps」ディレクトリに配置してもよさそうです。


##JDBCドライバの配置

### Oracle JDBCドライバ配置用のディレクトリ作成(任意)

ここでは、下記ディレクトリにドライバを配置することにします
　　　\<WLP_ROOT>\usr\shared\resources\oracle ディレクトリを作成

ドライバ類が1個しかない環境なら、resources直下にそのまま置いても良いと思いますが
Oracle、Db2など複数のデータベースにつながる環境なので、一応ディレクトリを分けます。

### Oracle JDBCドライバファイルの配置
Oracleサーバから入手できない場合は、以下のサイトからダウンロードします。
https://www.oracle.com/technetwork/database/application-development/jdbc/downloads/jdbc-ucp-19c-5460552.html

Oracleサーバが導入済みであれば、下記のディレクトリにJDBCドライバファイルがあるので、1つ前の手順で作成しておいたディレクトリにコピーしてきます

　　　%ORACLE_HOME%\jdbc\lib

このディレクトリには以下のファイルがあります。
Oracle 19cに同梱されるファイルは下記の5つで、それぞれのファイルの位置づけ・役割をOracle社のページから引用しておきます。
今回は、ごく普通にThinドライバが使えればよいだけなので、ojdbc8.jar のみ使います。

<dl>
<dt>ojdbc8.jar</dt>
<dd>Thinドライバで基本機能をサポートするためのすべてのクラス</dd>
<dt>ojdbc8_g.jar</dt>
<dd>ojdbc8.jarと同じ。ただし、デバッグ情報を含めるために-gオプションを指定してコンパイルし、java.util.loggingコールが含まれる点を除く</dd>
<dt>ojdbc8dms.jar</dt>
<dd>ojdbc8.jarと同じ。ただし、 Oracle Dynamic Monitoring Service（Oracle DMS）をサポートするためのコードが含まれる点を除く。また、JDBCロギング・サポートを含めた場合も除きます。このファイルが使用できるのは、dms.jarも クラスパスにある場合のみです。dms.jarファイルは、RDBMS製品の一部としては付属してい ません。Oracle Application Server製品の一部としてのみ使用できます。</dd>
<dt>ojdbc8dms_g.jar</dt>
<dd>ojdbc8dms.jarと同じ。ただし、デバッグ情報を含めるために-gオプションを指定してコンパイルし、全JDBCロギング・サポートが含まれる点を除く。</dd>
<dt>simplefan.jar</dt>
<dd>ONS経由でRACイベントをサブスクライブするためのJava API</dd>
</dl>

(参考)Oracle JDBC FAQ
https://www.oracle.com/technetwork/jp/database/application-development/jdbc/overview/default-090281-ja.html

(参考)Windows環境で ORACLE_HOME がわからない場合は、環境変数やレジストリ変数にて確認します
https://www.shift-the-oracle.com/config/show-environment-variable.html
http://replication.hatenablog.com/entry/20130109/1357659799



## server.xmlファイルの編集・配置
配置先は下記のディレクトリ：
　　　　\<WLP_ROOT>\usr\servers ディレクトリ

server.xmlの内容は、動いたものをそのまま添付しています。

 * featureとして、servlet-3.0/jdbc-4.0/jsp-2.2 を追加しておく
 * listen port は 9080/9443
 * LibraryエレメントにJDBCドライバの配置先ディレクトリ名とファイル名を記述(ファイル名はワイルドカード利用可)
 * dataSourceエレメントにはデータベースの接続情報(OracleサーバのURL、ユーザ名、パスワード)、JNDI名を記述
 * ドライバの種別(OCI or THIN)は、dataSource内のURL文字列で指定
 * アプリケーションと設定を一致させるべき箇所としては、DB接続アプリ側のデータソースのJNDI名と、server.xml側のデータソースJDNI名(jndiName)を一致させます。このserver.xmlの例では、jdbc/sample としています。


(server.xmlファイルの例)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

<!-- Enable features -->
<featureManager>
<feature>jsp-2.2</feature>
<feature>jdbc-4.0</feature>
<feature>servlet-3.0</feature>
</featureManager>

<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint id="defaultHttpEndpoint" host="*"
                  httpPort="9080"
                  httpsPort="9443" />

<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>

<!-- DataSource Conig(oracle)  -->
<!-- Declare the jar files for Oracle access through JDBC. -->
<library id="OracleLib">
  <fileset dir="${shared.resource.dir}/oracle" includes="*.jar"/>
</library>

<!-- Declare the runtime database -->
<dataSource id="OrclDS-1" jndiName="jdbc/sample">
    <jdbcDriver libraryRef="OracleLib"/>
    <properties.oracle URL="jdbc:oracle:thin:@//myhost:1521/ORCL" user="kana" password="password"/>
</dataSource>

<!-- Declare the application -->
<application id="SessionTest" location="Session.ear" name="SessionTest" type="ear"/>
<application id="JDBCSample" location="JDBCsample.war" name="JDBCSample" type="war"/>

</server>

```



dataSource エレメントは以下のように書いても接続できます。
tnsnames.oraと同一形式の記述方法ができる意味では、上の書き方（URL）にアドバンテージあり。

```xml
<dataSource id="OrclDS-2" jndiName="jdbc/sample" transactional="false">
  <jdbcDriver libraryRef="OracleLib"/>
  <properties.oracle driverType="thin" databaseName="ORCL"
                     serverName="myhost"
                     user="kana" password="password"/>
</dataSource>
```




##必要なフィーチャーのインストール
試しにサーバ起動してみたら、messages.logファイルにフィーチャーをインストールせよとの指令あり。
server-3.0 / jsp-2.2 / jdbc-4.0 のフィーチャーをコマンドでインストール。

```
C:\sw\ibm\was\wlp-webProfile8-19.0.0.6\wlp\bin>installUtility install jsp-2.2
構成されたリポジトリーへの接続を確立しています...
このプロセスは、完了するまでに数分間かかる場合があります。


構成されたすべてのリポジトリーへの接続が成功しました。


資産をインストールする準備をしています。 このプロセスは、完了するまでに数分間かかる場合があります。
ステップ 1 / 18: servlet-3.0 をダウンロード中...
ステップ 2 / 18: servlet-3.0 をインストール中...
ステップ 3 / 18: jsp-2.2 をダウンロード中...
ステップ 4 / 18: jsp-2.2 をインストール中...
ステップ 5 / 18: cdi-1.2 をダウンロード中...
ステップ 6 / 18: cdi-1.2 をインストール中...
ステップ 7 / 18: restConnector-1.0 をダウンロード中...
ステップ 8 / 18: restConnector-1.0 をインストール中...
ステップ 9 / 18: jaxrs-1.1 をダウンロード中...
ステップ 10 / 18: jaxrs-1.1 をインストール中...
ステップ 11 / 18: servlet-3.1 をダウンロード中...
ステップ 12 / 18: servlet-3.1 をインストール中...
ステップ 13 / 18: jaxrsClient-2.0 をダウンロード中...
ステップ 14 / 18: jaxrsClient-2.0 をインストール中...
ステップ 15 / 18: jaxrs-2.0 をダウンロード中...
ステップ 16 / 18: jaxrs-2.0 をインストール中...
ステップ 17 / 18: インストール済みフィックスを検証中...
ステップ 18 / 18: 一時ファイルをクリーンアップしています...




すべての資産が正常にインストールされました。


製品妥当性検査を開始します...
製品妥当性検査が正常に完了しました。


C:\sw\ibm\was\wlp-webProfile8-19.0.0.6\wlp\bin>installUtility install jdbc-4.0
構成されたリポジトリーへの接続を確立しています...
このプロセスは、完了するまでに数分間かかる場合があります。


構成されたすべてのリポジトリーへの接続が成功しました。


資産をインストールする準備をしています。 このプロセスは、完了するまでに数分間かかる場合があります。
ステップ 1 / 4: jdbc-4.0 をダウンロード中...
ステップ 2 / 4: jdbc-4.0 をインストール中...
ステップ 3 / 4: インストール済みフィックスを検証中...
ステップ 4 / 4: 一時ファイルをクリーンアップしています...




すべての資産が正常にインストールされました。


製品妥当性検査を開始します...
製品妥当性検査が正常に完了しました。


C:\sw\ibm\was\wlp-webProfile8-19.0.0.6\wlp\bin>

```







-----------

### Oracle RACとつなぐ時の server.xml

https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_oraclerac.html

Liberty の Oracle RAC を構成するには、以下のように server.xml に接続文字列を記述します。

```xml
<dataSource id="ds_id" jndiName="jdbc/ds_id ">
  <jdbcDriver>
    <library>
      <fileset dir="path_to_oracle_jar" includes="ojdbcX.jar"/>
    </library>
  </jdbcDriver>
  <properties.oracle 
  URL="jdbc:oracle:thin:@(DESCRIPTION=(FAILOVER=ON)(LOAD_BALANCE=OFF)(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=port1))
  (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=port2))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=name)))" 
  user="username" password="password" />
</dataSource>
```