Seasar(シーサー)は、国内のコミュニティ「The Seasar Project」によって開発が行われているオープンソースプロダクトだ。DI+AOPコンテナとして評価が高いSeasarV2は、J2EE開発の現場にも影響力を持ち始めた。例えば電通国際情報サービスがSeasar Projectを正式に支援することを表明し、2005年6月からは同社による商用サポートサービスが開始されている。本連載では、同プロジェクトの代表的なプロダクトを紹介していく。(編集局)
SeasarV2(以下S2)には、これまで紹介してきたDIとAOPだけではなく、DBアクセスに関する機能も用意されています。DBアクセスにはトランザクション制御が付き物ですが、S2では、それをインターセプタによって行います。また、実行環境のJDBCドライバがJTAをサポートしていなくても、S2JTAによりそれをエミュレートできるという特長も持ちます。
接続するデータベースやコネクションプールの設定はdiconファイルに記述し、ソースコードにそれらの情報が記述されることはありません。また、SQL文さえもJavaソースコードから分離してdiconファイルに記述する方法も用意されています。DB技術者とJavaプログラマの作業をできるだけ分離したいという場合には、こうした機構も活用してみてください。
今回は、S2でDBアクセスするための手順を紹介することで、S2のDI+AOP技術がDBアクセスにおいてどう生かされているかを理解いただきます(今回の説明に関連する全ソースコードはここからダウンロードできます)。
S2でDB接続を行うためには、最初にデータベースの接続先、コネクションプール、トランザクション制御を設定します。S2は専用のインターセプタでトランザクション制御を行います。
DBアクセスを行う前に、データベースの接続先を設定します。具体的には、JDBCドライバのクラス名、接続先を表すURL、ユーザー名、パスワードを指定します。
S2では、これらをorg.seasar.extension.dbcp.impl.XADataSourceImplクラスのプロパティとして設定することをdiconファイルに記述します。このクラスはJTAのXAResourceをエミュレートするものです。設定されるのは文字列の定数なので引用符で囲みます。もし使用するデータベースでjavax.sql.XADataSourceインターフェイスを実装したクラスを利用できる場合には、そちらを使うことも可能です。
では実例を見てみましょう。以下はMySQLの場合の設定例です。MySQLでは、あらかじめmy.iniファイルにデフォルトのエンコード設定default-character-set=SJISを設定済みだとします。なお、本稿で使用しているMySQLのバージョンは4.1.12aです。そしてJDBCドライバはConnector/J 3.1.8です。
MySQLの場合の設定例(diconファイル内) |
<component name="xaDataSource" |
接続するデータベースを設定したら、次はコネクションプールの設定をdiconファイルに記述します。以下に設定例を示します。コネクションプールを行うクラスはorg.seasar.extension.dbcp.impl.ConnectionPoolImplです。
コネクションプールの設定例(diconファイル内) |
<component name="connectionPool" |
timeout……用意したコネクションがこの時間以上使われないでいると破棄される
maxPoolSize……同時に接続可能なコネクションの数
allowLocalTx……JTAの制御下にないJDBCのローカルトランザクションを許可する(true)
S2では、トランザクションを専用のインターセプタで制御します。インターセプタはトランザクション属性に応じて表1のように分かれています。ただ、アプリケーションを開発するごとにこれらをコンポーネント定義に記述するのは面倒ですから、S2に用意されているj2ee.diconというdiconファイルをインクルードし、そこに定義されているコンポーネント名を用いるようにすると、アプリケーションのdiconファイルの記述量を減らすことができます。
トランザクション属性 | インターセプタのクラス名 | j2ee.diconでの定義 |
---|---|---|
Required | RequiredInterceptor | j2ee.requiredTx |
RequiresNew | RequiresNewInterceptor | j2ee.requiresNewTx |
Mandatory | MandatoryInterceptor | j2ee.mandatoryTx |
NotSupported | NotSupportedInterceptor | j2ee.notSupportedTx |
以下に、インターセプタの設定例を示します。
インターセプタの設定例 |
<components> |
コラム データベース関連の設定は別のdiconファイルへ
データベースの接続先やトランザクション制御などの設定は、複数のアプリケーションで共有する可能性があります。その場合には、それぞれのアプリケーションでこうした設定を記述したdiconファイルを用いるのではなく、1つのdiconファイルにデータベース関連の設定をまとめて記述しておき、それらをアプリケーションのdiconファイルでインクルードする方法を取るようにすると、設定の共有が便利になるでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.