リスト8●データベース接続とコネクション・プーリングを設定するj2ee.diconの内容(抜粋)
リスト8●データベース接続とコネクション・プーリングを設定するj2ee.diconの内容(抜粋)
[画像のクリックで拡大表示]
表4●Seasar2のコネクション・プーリング機能で利用できるパラメータ
表4●Seasar2のコネクション・プーリング機能で利用できるパラメータ
[画像のクリックで拡大表示]
リスト9●データベース接続を行う実装クラスであるDatabaseMessageImplクラスのソースコード
リスト9●データベース接続を行う実装クラスであるDatabaseMessageImplクラスのソースコード
[画像のクリックで拡大表示]
リスト10●サンプルでデータベース連携を行う場合にMessage.diconに加える変更
リスト10●サンプルでデータベース連携を行う場合にMessage.diconに加える変更
[画像のクリックで拡大表示]
表5●messageテーブルのフィールド・レイアウト
表5●messageテーブルのフィールド・レイアウト
[画像のクリックで拡大表示]
図4●実装クラスとしてDatabaseMessageImplを指定した場合のMessageServlet実行結果。サンプルは,messageプロパティをキーとして,データベースから読み出す内容を指定するようになっている
図4●実装クラスとしてDatabaseMessageImplを指定した場合のMessageServlet実行結果。サンプルは,messageプロパティをキーとして,データベースから読み出す内容を指定するようになっている
[画像のクリックで拡大表示]

コネクション・プーリングによるデータベース連携

 Seasar2本体が提供するのは,あくまでDIコンテナとしてのコアな機能です。データベース接続やコネクション・プーリング,自動トランザクションといった機能は拡張機能として提供されています。必要最低限の機能以外を外に出すことで,Seasar2そのものはシンプルな実装を保ちつつ,多機能を実現しているのです。

 今回は,拡張機能の中でも,特によく利用されると思われるコネクション・プーリングによるデータベース連携を試してみます。

 コネクション・プーリングとは,その名の通り,データベースへの接続をあらかじめプール(保持)しておく仕組みを言います。サーバーサイド・アプリケーションのように不特定多数のユーザーが断続的にデータベースを利用する環境では,毎回いちいちデータベースに接続するのは無駄が多く,パフォーマンス低下の原因にもなります。コネクション・プーリングを利用することで,接続が必要な際にプールから接続を取り出し,不要になった場合にプールに戻して再利用できます。これにより,処理効率が大幅に向上します。サーバーサイドのデータベース連携アプリケーションでは,コネクション・プーリングは必須の機能と言えます。

 従来は,コネクション・プーリング機能を利用するには,アプリケーション・サーバーが必要でした。Seasar2を利用すれば,アプリケーション・サーバーがなくてもこうした機能を簡単に利用できます。

 コネクション・プーリングや自動トランザクションなど,主にJ2EE開発で必要なコンポーネントの登録や設定を行うのは,/WEB-INF/classes/フォルダに配置するj2ee.dicon(リスト8[拡大表示])の役割です。j2ee.diconにはデフォルトでJ2EE拡張機能にかかわる設定が,すでに記述されているので,環境に依存する要素を適宜,編集してください。なお,j2ee.diconは,app.diconまたはMessage.diconでインクルードしておく必要があります。

 データベース接続に関する設定を行っているのは,リスト8(1)の部分です。j2ee.diconにはデフォルトで,Javaベースのオープンソース・データベースであるHSQLDBに接続するための設定が記述されています。サンプルではMySQLを利用しているので,記述をMySQL用に書き直しています。データベース接続時に利用できるパラメータを表3にまとめました。

 次に,コネクション・プーリングに関する設定を行います。こちらもj2ee.diconにデフォルトで記述されています(リスト8(2))。特に変更の必要がなければ,そのまま使用すればよいでしょう。変更や追加の必要があれば,編集します(表4[拡大表示])。なお,<destroyMethod>要素は,Seasar2コンテナが破棄されるタイミングで呼び出されるメソッドを指定します。ここでは,ConnectionPoolImpl#closeメソッドを呼び出すよう設定しています。

サーブレットからSeasar2経由でデータベースに接続しよう

 では実際にデータベースに接続してみましょう。まず,データベース接続を行う実装クラスとして,先ほどのIMessageインタフェースを実装したDatabaseMessageImplクラスを定義します(リスト9[拡大表示])。また,Message.diconを(リスト10[拡大表示])のように書き換えます。

 Message.diconでは,messageプロパティとして「morning」を指定しています。サンプルのデータベースには「message」というテーブルの中に「mkey」と「body」の二つのフィールドがあらかじめ用意されており,mkeyが「morning」の場合はbodyが「Good Morning」,mkeyが「night」の場合はbodyが「Good Night」になっています(表5[拡大表示])。この状態でサーブレットMessageServletにアクセスすると,指定したmorningというキーに対応した「Good Morning !」というメッセージが動的に出力されます(図4上[拡大表示])。次にMessage.diconのmessageプロパティを「night」に書き換えてTomcatを再起動すると表示が「Good Night !」になることが確認できます(図4下)。

 動作を確認したところで,注目していただきたいのがリスト9(1)の部分です。DatabaseMessageImplクラスのコンストラクタに,引数としてDataSourceオブジェクトを渡しています。このようにコンストラクタを定義した場合,Seasar2はコンポーネントを初期化するタイミングで,コンポーネント定義ファイル内の適切なDataSourceを取得し,自動的に引き渡しを行います。ここでは,j2ee.diconのデータベース接続の設定(リスト8(1))に基づいて,コンポーネントの取得処理が行われます。これは,先ほど紹介した「コンストラクタ注入」に相当する機能です。

☆               ☆               ☆

 以上,今回はオープンソースで提供される軽量コンテナとしてSeasar2を取り上げました。これまで「J2EEプログラミングは難しいな」と敬遠してきた皆さんも,これを機会にSeasar2をはじめとする軽量コンテナに目を向けてみてはいかがでしょうか。なお,Seasar2に関する詳細な情報を知りたい方は,Seasar2のサイト(http://www.seasar.org/s2.html)に詳細なドキュメントがあります。

 次回は,軽量コンテナとともに最近注目を集めているO/R(Object/Relational)マッピング・ツールを取り上げる予定です。お楽しみに。


山田 祥寛(やまだ よしひろ)

千葉県鎌ヶ谷市在住のフリーライター(http://www.wings.msn.to/