WARファイル1つで、DBアクセスも使うサンプルの作り方

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アプリ


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)