どぅーちゅいむーにー

これ、Twitterでよくね?という日々の記録かも

GlassFish に触れる(3):データソースの設定

Tomcat で動くようにしていたWebアプリを GlassFish にのっけてみよう、というわけで、まずは DB 接続の設定を。


Sun GlassFish Enterprise Server v3 管理ガイドの「データベースの設定」あたりをみながらやってみる。
http://docs.sun.com/app/docs/doc/821-1299/6nm9tg85u?l=ja&a=view#indexterm-650


○接続するデータベース
今回接続するのは、社内勉強会用に適当につくった JavaDB(Derby)にしてみます。


一応、ネットワーク接続可能なようにローカルに構築してあったので、そこに接続することにします。
Tomcat における Resource 定義的には以下のようになっています(以下、なんかよくわからない </ppp>が表示されるのは気にしないことにします)。



ちなみに、ij を使うとこんな感じになっています。

C:\Documents and Settings\k155e1>ij
ij バージョン 10.5
ij> connect 'jdbc:derby://localhost:1527/testdb';
ij> select * from test_user;
ID |PASSWORD

                                              • -

k155e1 |test
test |hogehoge

2 行が選択されました
ij> disconnect;

ちなみに、動かすWebアプリは、単にログイン画面があって、アカウントとパスワードを入力してフォームを Submit すると、このテーブルを使って認証するというレベルのものです。


○接続プールの作成
管理コンソールから、「リソース」-「JDBC」を選ぶと、

  • JDBCリソース
  • 接続プール

という2つの項目があることがわかる。


Tomcat で、コンテキスト.xml(って言うんだっけ?)に Resource ノード(XML的に)で定義していたので、イメージ的には
JDBCリソースのほうに定義するものとばかり思っていろいろ試していたのですが、そういうわけではないらしい。
まずは、接続プールというのもを作成する。


「リソース」-「JDBC」-「接続プール」を選ぶと、『__TimerPool』と『DerbyPool』というのが定義済になっているかと思います。
すでに定義されている『DerbyPool』は一番初歩的な(?) Derby(create=true するとか)への接続用になっているので、testdb 用に新しく接続プールを作成します。


接続プールの一覧から「新規...」ボタンをクリックし、「新しい JDBC 接続プール (ステップ 1/2)」画面に移動します。

Derby というか JavaDB の場合の設定については、マニュアル「Java DB/Derby Type 4 ドライバ」のほうに書かれています↓
http://docs.sun.com/app/docs/doc/821-1299/beamw?l=ja&a=view
この画面で入力したのは以下の通り。
名前:MyDerbyPool
リソースタイプ:javax.sql.DataSource
データベースベンダ:JavaDB(たしか)


次へボタン押下で次に進みます。


「新しい JDBC 接続プール (ステップ 2/2)」画面が表示されるかと思いますが、基本、いろいろとデフォルト値が設定されています。
ですので、ここから必要な情報のみ記述します。というか、具体的には画面下部にある『追加プロパティ』を編集します。
※私はこのあといろいろとハマったので、このタイミングでは設定しませんでしたが・・・


設定する情報は以下に。
User:APP
Password:APP
DatabaseName:testdb
あと気になるところとしては ServerName と PortNumber ですが、こちらはデフォルト(localhost, 1527)が指定されていたのでそのまま。


これで完了ボタンを押下すれば終わり。
問題がなければ「JDBC 接続プール」の一覧画面に戻るかと思います。
一覧に作成した接続プールが表示されていればOKです。


JDBCリソースの作成
左ペインから「リソース」-「JDBC」-「JDBCリソース」を選び、JDBCリソースの一覧を表示します。
こちらにもデフォルトで『jdbc/__TimerPool』、『jdbc/__default』というのが定義されているかと思います。


「新規...」ボタンを押下して、JDBCリソースを作成します。
『新しい JDBC リソース』画面で入力するのは2点。
JNDI名:jdbc/test_db
プール名: MyDerbyPool を選択
説明: (必要なら入力)
※JNDI名は、web.xml での定義に合わせる必要があります。
動かしてみた Web アプリの web.xml における DataSource の定義は以下のようになっていました。



jdbc/test_db
javax.sql.DataSource
Container

なので JNDI 名が「jdbc/test_db」となった感じです。
追加プロパティは特に指定していません。


OKボタンを押下すれば JDBC リソースが作成されます。
一覧に追加した JNDI 名のものが追加されていればOKかと。


以上で定義作業は終わりです。


トラブルシューティング

  • 接続プールにおける User と Password

作成した Derby のデータベースが勉強会(初心者向け)というのもあり、適当に作成しており、ユーザやパスワードを考えずに準備していました。
しかしながら User と Password を指定しないとエラーになります。
具体的には、DBへの接続タイミングで以下のエラーが server.log (path/to/glassfishv3/glassfish/domains/domain1/logs/server.log)に出力されます。


[#|2010-10-20T15:11:22.390+0900|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=29;_ThreadName=Thread-1;|java.sql.SQLException: Error in allocating a connection. Cause: Connection could not be allocated because: ユーザー ID の長さ (0) が 1 から 255 の範囲外です。
もともと Eclipse で DBViewer プラグインを使ってアクセスしていたこともあり、そこを参考にしょうと思ってみたら、ユーザ・パスワードともに test で設定されていてかつ接続できていたので、接続プールでも User、Password ともに test を設定すると、起動時(asadmin start-domain)に以下のエラーが発生。

[#|2010-10-20T14:49:23.453+0900|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=33;_ThreadName=Thread-1;|java.sql.SQLSyntaxErrorException: スキーマ 'TEST' は存在しません
というわけで、悩んでしまったわけですが、Derby のデフォルトのスキーマは APPということに気づき、接続プールの設定でUser、Password ともに APP を指定することで無事に DB 接続もできるようになりました。


パスワードについては、他の文字列でも大丈夫かもしれませんが、試してはいません。