Docker上のWebLogic ServerでDerbyを使ってJDBCのデータベース接続を簡単に試す方法

# はじめに

Dockerを使って、簡単にWebLogic Serverを起動して自分のPCで試せるようになりました。
参照：[Dockerで実践！ WebLogic Server 12.2.1のマルチテナントのサンプル環境を簡単に作成する](http://qiita.com/nobuhikosekiya/items/1979aef71b533a3b1450)

せっかくだからWebLogic Serverでのデータベース接続も使ってみたいと思います。とはいえ、同じDockerコンテナに色々ソフトを詰め込むのはDockerコンテナも重くなってよろしくないので、別のDockerコンテナにDBを入れて、そことつなぐのが思い浮かびますが、ちょっと手間かかりそうです。
そこで、とりあえずどんなDBでもいいから試したいという場合、WebLogic Server起動時に一緒に起動してくるDerbyデータベースが利用できます。
上の記事の中のMedrecというサンプルアプリケーションでもDerbyを使っていましたが、このときは勝手に構成されてしまっていたので、やり方がよくわからないと思います。

そこでデータソースの定義でDerbyを使う方法を書こうと思ったのですが、最新のWebLogic 12.2.1にはDefaultDatasourceというJava EE7の機能が使えるということを発見しました。

デフォルト・データ・ソースの使用
http://docs.oracle.com/cd/E72987_01/wls/JDBCA/default_datasource.htm

このDefaultDataSourceを使うと、データソースの定義をせずに決まったJNDI名(java:comp/DefaultDataSource)でアプリケーションからデータソースを参照するだけでJDBCが利用できます。WebLogic Serverの場合はデフォルト・データ・ソースとしてDerbyに勝手に接続してくれます。

せっかくですので、Derby用のデータソースを定義する方法と、DefaultDataSourceを使う両方のやり方をまとめます。前者はWebLogic Server 12.1.3などの下位バージョンでも使える手順ですが、後者はJava EE7前提なため、12.2.1である必要があります。

# DefaultDataSourceを使ってDerbyへアクセス
Dockerを使っている場合は、dockerコマンドでWebLogic Server 12.2.1を起動します。今回はさらのドメインである1221-domainのDockerイメージを使います。

`docker run -it -p 8001:8001 1221-domain`

そして、WebLogicの管理コンソールにログインします。

あとデフォルトデータソースを参照しているアプリケーションをデプロイして、その中でJDBCを使うだけです。具体的には、以下のようなコードでデフォルトデータソースを参照します。

例１

```
@Resource(lookup="java:comp/DefaultDataSource")
DataSource myDS;
```

例２

```
InitialContext ctx = new InitialContext();
DataSource myDS = (DataSource) ctx.lookup("java:comp/DefaultDataSource");
```

今回はテストとして、自作のDBテスト用のアプリケーションを使ってみます。
GitHubに登録してありますので、よければ使ってみてください。
[easydbtester.war](https://github.com/nobuhikosekiya/easydbtester/tree/v1.0/easydbtester.war)（リンク先の"View Raw"をクリックするとダウンロードが開始されます。）

これをデプロイし、アプリケーションにブラウザからアクセスします。（IPアドレスやポートなどは自分の環境に合わせてください）
http://192.168.99.100:8001/easydbtester/

SQLを発行できるテストアプリケーションです。
まずはUpdateの方で、以下の用に「Use DefaultDataSource」をtrueにしてみてください。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/2121d527-9f1f-27e9-e5a0-42fc31190560.png)

内部のソースコードはこんな感じで、trueにした場合にデフォルトデータソースを利用するための固定の文字列java:comp/DefaultDataSourceでデータソースを参照するようになっています。

```
		if (useDefaultDatasource) {
			datasource = "java:comp/DefaultDataSource";
		} else {
```

```
		InitialContext ctx;
		Connection conn = null;
		try {
			ctx = new InitialContext();
			DataSource ds = (DataSource) ctx.lookup(datasource);
			conn = ds.getConnection();
```

上の例のようにcreate table文を入れてsubmitします。
`create table dummy (dummy_message varchar(300))`
以下のような出力が出たら、テーブル作成できました。

```
datasource: java:comp/DefaultDataSource
sql: create table dummy (dummy_message varchar(300))
loop: 1
update count: 0
success
```

あとは、以下のようなSQLで色々と遊んでみてください。select系はselectのフォームを使ってください。selectしてもデータは見れません。行数だけわかる簡単なアプリです。
`insert into dummy (dummy_message) values ('dummy_data')`
`select * from dummy`

マニュアルに書かれていますが、デフォルトデータソースは基本的に設定などを変更できません。（別途カスタムのデフォルトデータソースというのは作れるようです）

見たとおりデータソースの画面には定義は表示されません。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/9f211a82-bfae-80bf-3e13-a3c907f58bc2.png)

しかし、モニタリングタブを見ると確認できました。どうやら初めてデフォルトデータソースが参照されたときにここに表示されるようです。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/395d9ceb-4e67-a938-511e-ee9b9e8dfbbb.png)

サーバーログからこのデフォルトデータソースの作成時の様子が見えます。

```
####<Apr 15, 2016 9:36:30 AM UTC> <Info> <JDBC> <e3659ea2d59b> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <710e17a1-c937-4d3a-81a4-0625c9285ee9-00000011> <1460712990580> <[severity-value: 64] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-001503> <Creating application-scoped data source connection pool java:comp/DefaultDataSource for Application easydbtester, Module easydbtester, URL = jdbc:derby://localhost:1527/DefaultDataSource;ServerName=localhost;databaseName=DefaultDataSource;create=true, Properties = portNumber=1527;databaseName=DefaultDataSource;create=true;serverName=localhost;.> 
```

※ちなみにDockerでサーバーログをPC（Docker クライアント）にダウンロードして見るにはこうしました。コンテナIDはdocker psコマンドで確認してください。
`$ docker cp e3659ea2d59b:/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/logs/AdminServer.log AdminServer.log`

# 自分でDerby用のデータソースを作成する方法
デフォルトデータソースを使わない方法です。

データソースのリンクをクリックし、（編集ロック解除した上で）新規で汎用データソースを選択します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/9bd68227-1391-d1fa-5dd1-6f33c347523f.png)

下の例のように入力します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/eeb78a9a-a063-f0f3-8ed2-d337f3685920.png)

次の画面では今回client datasourceというやつを選択しました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/c2204d15-5ca8-c44b-5993-bae61a33602d.png)

次の画面は何も変更せずに次へ行きます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/2d812530-2bde-5f02-4ad9-679c4bb0731b.png)

次の画面で以下の例のように入力します。データベース名やユーザー名は、事前作成なく使えますので、何でもいいです。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/c33e83b7-0e1f-0ffa-7ed9-6171e8fffdc8.png)

次の画面でテストボタンでテストします。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/21c50a76-bc3d-9fd3-ed2d-698a54ba0e93.png)

最後に、ターゲットとしてAdminServerを選択します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/da7f0f86-1f49-19d4-85ee-763da32db462.png)

easydbtesterで今度は、Use DefaultDatasourceをfalseにし、いま作ったデータソースのJNDI名を入力します。そしてcreate table文を流します。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/128cc4b2-4739-b2cc-a1e0-b41e6cc46598.png)

そのあとは前と同じ様にinsertやselectをしてみると、ちゃんとDBとして使えていることがわかります。（selectの方もUse DefaultDatasourceをfalseにしておくのを忘れずに）

以上