StrutsなどのWebアプリケーションでは、データベースアクセスが当然のように行われます。
Webアプリケーションのサンプルを試す側としては、できるだけ簡単にサンプルが動かしたいものです。
サンプルを提供する側としては、WARファイルを放り込むだけで、動作するようにしたいのですが、データベースが絡むと簡単にはできませんでした。
書籍ではよく、MySQLやPostgreSQLが付属していて、それらのインストールや設定も必要となります。HSQLDBなんかを使えば、データベースごと丸ごと配布というのも可能です。
でも、Webアプリを学習しようとしている人は、データーベース環境を整えることに時間を割きたくないし、とにかく簡単にサンプルを動かしたいと思うのです。
そこで、HSQLDBの”In-Memory Database”を使って、WARファイル1つで導入できる、ポータブルなWeb-DBアプリの作り方を紹介します。
ポータブルなWeb-DBアプリの作り方
- 初期データとしてのSQLファイルを、リソースとして格納する
- Filterのinit時に、In-Memory Databaseに接続する
- 接続後、初期データSQを投入する
このような方法で作成することで、DBを使用するポータブルなWARが作成できます。
データベースはWebアプリケーションのコンテキストが存在している期間だけ保持されます。
コンテキストが再ロードされれば、再び初期データに戻ります。(良くも悪くもある)
初期データ用のSQLファイルは、create table文やinsert文で構成され、必要なデータベース環境を構築するように作成します。
これを、クラスパス中に配置します。あとでプログラムから読み込みます。
Filterを作成し、Filterのinit時に、In-Memory Databaseに接続します。
このサンプルでは、HSQLDBに実装されているjdbcDataSourceを作成しています。
※本当であれば、JNDIを使ったDataSourceの取得を行いたかったのですが、そうするとJDBCドライバをTomcatなどのAPサーバ側に導入する必要がでます。
またAPサーバ側へのDataSource設定は、APサーバ依存になってしまいます。(Tomcatならばcontext.xmlの配布)
ポータブルであることを優先するために、このような方法にしました。
上記のSQLファイルを読み込み、SQLを発行します。初期データが構築されます。
あとは、通常のデータベースアプリケーションと同様です。
initメソッドはこのような記述になります。CommonsのDBUtilsとIOUtilsを使っています。
//DataSourceの取得
jdbcDataSource jDataSource = new jdbcDataSource();
jDataSource.setDatabase("jdbc:hsqldb:mem:portable");
jDataSource.setUser("sa");
ds = jDataSource;
//データ投入
String sql = IOUtils.toString(this.getClass().getResourceAsStream("/init.sql"));
new QueryRunner(ds).update(sql);
さっそくサンプル
これを実践したポータブルなWEB-DBアプリケーションのサンプルです。
warファイルを、webappsディレクトリに放り込み、
ブラウザからhttp://localhost:8080/portable/にアクセスしてください。
すぐに動作確認できます。(※URLは環境に合わせてください)
問題点として、データベースがメモリ中で完結しているので、外部からデータを参照してデータ検証することができないです。
私の場合は、SQLクライアントとして動作するJSPを作って、それでSQLを実行して中身を見ています。
※Standaloneモードで同様のことができればいいのですが、ファイルパスの部分でポータブルにできなかったです。
これからは、この方法を使って、どんどんDBアプリのサンプルを作っていこうと思います。
WARを置くだけで、確認できるサンプルって重要ですよね。
※8/25追記
In-Processモードを使って、ポータブルなWeb-DBアプリを作る方法も分かりました。
そちらの方が、データが永続化できて便利だと思います。
関連記事:In-Processで作るポータブルなWEB-DBアプリ