はじめに
Dockerを使って、簡単にWebLogic Serverを起動して自分のPCで試せるようになりました。
参照:Dockerで実践! WebLogic Server 12.2.1のマルチテナントのサンプル環境を簡単に作成する
せっかくだから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を使うだけです。具体的には、以下のようなコードでデフォルトデータソースを参照します。
例1
@Resource(lookup="java:comp/DefaultDataSource")
DataSource myDS;
例2
InitialContext ctx = new InitialContext();
DataSource myDS = (DataSource) ctx.lookup("java:comp/DefaultDataSource");
今回はテストとして、自作のDBテスト用のアプリケーションを使ってみます。
GitHubに登録してありますので、よければ使ってみてください。
easydbtester.war(リンク先の"View Raw"をクリックするとダウンロードが開始されます。)
これをデプロイし、アプリケーションにブラウザからアクセスします。(IPアドレスやポートなどは自分の環境に合わせてください)
http://192.168.99.100:8001/easydbtester/
SQLを発行できるテストアプリケーションです。
まずはUpdateの方で、以下の用に「Use DefaultDataSource」をtrueにしてみてください。
内部のソースコードはこんな感じで、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
マニュアルに書かれていますが、デフォルトデータソースは基本的に設定などを変更できません。(別途カスタムのデフォルトデータソースというのは作れるようです)
しかし、モニタリングタブを見ると確認できました。どうやら初めてデフォルトデータソースが参照されたときにここに表示されるようです。
サーバーログからこのデフォルトデータソースの作成時の様子が見えます。
#### <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用のデータソースを作成する方法
デフォルトデータソースを使わない方法です。
データソースのリンクをクリックし、(編集ロック解除した上で)新規で汎用データソースを選択します。
次の画面では今回client datasourceというやつを選択しました。
次の画面で以下の例のように入力します。データベース名やユーザー名は、事前作成なく使えますので、何でもいいです。
最後に、ターゲットとしてAdminServerを選択します。
easydbtesterで今度は、Use DefaultDatasourceをfalseにし、いま作ったデータソースのJNDI名を入力します。そしてcreate table文を流します。
そのあとは前と同じ様にinsertやselectをしてみると、ちゃんとDBとして使えていることがわかります。(selectの方もUse DefaultDatasourceをfalseにしておくのを忘れずに)
以上