連載
» 2005年09月03日 00時00分 公開

Seaser Projectの全貌を探る(3):SeasarV2によるDBアクセス機能 (1/3)

Seasar(シーサー)は、国内のコミュニティ「The Seasar Project」によって開発が行われているオープンソースプロダクトだ。DI+AOPコンテナとして評価が高いSeasarV2は、J2EE開発の現場にも影響力を持ち始めた。例えば電通国際情報サービスがSeasar Projectを正式に支援することを表明し、2005年6月からは同社による商用サポートサービスが開始されている。本連載では、同プロジェクトの代表的なプロダクトを紹介していく。(編集局)

[沖林正紀,@IT]

 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は専用のインターセプタでトランザクション制御を行います。

接続するデータベースの設定(S2JTA)

 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"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
  <property name="driverClassName">"com.mysql.jdbc.Driver"</property>
  <property name="URL">"jdbc:mysql://localhost/accountdb"</property>
  <!-- my.iniの[mysqld]セクションにdefault-character-set=SJISを設定済み -->
  <property name="user">"root"</property>
  <property name="password">"admin"</property>
</component>

コネクションプールの設定(S2DBCP)

 接続するデータベースを設定したら、次はコネクションプールの設定をdiconファイルに記述します。以下に設定例を示します。コネクションプールを行うクラスはorg.seasar.extension.dbcp.impl.ConnectionPoolImplです。

コネクションプールの設定例(diconファイル内)
<component name="connectionPool"
    class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
  <property name="timeout">600</property>
  <property name="maxPoolSize">10</property>
  <property name="allowLocalTx">true</property>
  <destroyMethod name="close" />
</component>

timeout……用意したコネクションがこの時間以上使われないでいると破棄される
maxPoolSize……同時に接続可能なコネクションの数
allowLocalTx……JTAの制御下にないJDBCのローカルトランザクションを許可する(true)

トランザクションの設定(S2Tx)

 S2では、トランザクションを専用のインターセプタで制御します。インターセプタはトランザクション属性に応じて表1のように分かれています。ただ、アプリケーションを開発するごとにこれらをコンポーネント定義に記述するのは面倒ですから、S2に用意されているj2ee.diconというdiconファイルをインクルードし、そこに定義されているコンポーネント名を用いるようにすると、アプリケーションのdiconファイルの記述量を減らすことができます。

表1 トランザクション制御を行うインターセプタ
(クラスはすべてorg.seasar.extension.txパッケージ)
トランザクション属性 インターセプタのクラス名 j2ee.diconでの定義
Required RequiredInterceptor j2ee.requiredTx
RequiresNew RequiresNewInterceptor j2ee.requiresNewTx
Mandatory MandatoryInterceptor j2ee.mandatoryTx
NotSupported NotSupportedInterceptor j2ee.notSupportedTx

 以下に、インターセプタの設定例を示します。

インターセプタの設定例
<components>
  <include path="j2ee.dicon" />
  <component class="myfirst.jdbc.AccountDaoImpl">
    <aspect>j2ee.requiredTx</aspect>
  </component>
</components>

コラム データベース関連の設定は別のdiconファイルへ

データベースの接続先やトランザクション制御などの設定は、複数のアプリケーションで共有する可能性があります。その場合には、それぞれのアプリケーションでこうした設定を記述したdiconファイルを用いるのではなく、1つのdiconファイルにデータベース関連の設定をまとめて記述しておき、それらをアプリケーションのdiconファイルでインクルードする方法を取るようにすると、設定の共有が便利になるでしょう。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。