StrutsでDBを利用するケースは頻繁にあると思いますが、Strutsでは特にDBアクセスの方法が明示的に決められているわけではありません。自由な方法でDBアクセスをすることを選択できます。
私の周りでは、「DB接続の取得→SQL発行→DB接続の終了」といった比較的レガシーな方法も未だに多いので、StrutsからどのようにDB接続を利用するかについて考察してみたいと思います。
※ちなみにレガシーでない方法というのは、StrutsのレイヤーではDBを意識させることのないアーキテクチャかと思います。ビジネスロジック層でO/Rマッピングなどを利用するのがイマドキの方法かと思います。
2つの観点を考察しています。
- DataSourceの管理←今回
- Connectionの維持
「DataSourceの管理」はDB接続をどのように取得するかについてです。Webアプリケーションの場合は、頻繁に接続切断が繰り返されることから、あらかじめDB接続プール(貯めこむ)しておく方法が一般的です。接続プールの用意や接続の取得方法について解説します。
「Connectionの維持」は、いつDB接続を取得し、得られた接続をどのように維持するかについて考察します。プログラムのあちこちで例外発生時のロールバック処理などを記述しなくても済むようにする必要があります。
今回は「DataSourceの管理」について書いてあります。
サンプルはこちらです。
DataSourceの管理
DB接続はDataSourceから取得します。DataSourceを用意する方法が2種類考えられます。
※APサーバ=アプリケーションサーバの意
- Struts管理
- レガシー。Webアプリケーションで用意。APサーバ非依存。
- APサーバ管理(JNDI経由)
- APサーバ管理のDataSourceを使用。Struts非依存。
Struts管理というのは、古いStrutsでは標準的なDB接続方法だったのですが、今ではあまり推奨されていません。APサーバが提供するDataSourceを使うべきなようです。
図のようにTomcat内に配備されたWebアプリケーションが、接続プールとDataSourceを持ちます。この実装を実現するためのライブラリやJDBCドライバは、すべてWebアプリケーションで用意する必要があります。
APサーバ管理は、Strutsに限った話ではなく標準のJ2EEの仕組みを使用したものです。DB接続をAPサーバに管理させ、そこから接続を拝借するというパターンです。
拝借するときにはAPサーバに依存しないように、これまた標準のJNDIという仕組みで取得します。JNDIというのは、名前を指定してオブジェクトを得る仕組みです。
この場合には、Webアプリケーション側にはJDBCドライバは必要なくTomcatに用意する必要があります。図のように接続プールを複数のWebアプリケーションで共有することも可能です。
相違点を表にするとこんな感じです。(*T*はTomcatにおける設定)
Struts管理 | APサーバ管理(JNDI経由) | |
---|---|---|
DB接続担当 | Struts | APサーバ |
接続プールの場所 | Struts | APサーバ |
接続設定 | struts-config.xml | APサーバの設定 *T*server.xml (or context.xml) |
JDBCドライバの配置場所 | アプリケーションコンテキスト WEB-INF/lib |
APサーバ *T*common/lib |
追加で必要な依存ライブラリ | commons-dbcp commons-collection commons-pool |
なし |
DataSourceの取得方法 | Action#getDataSource | JNDI経由 |
細かい実装はサンプルを参照していただくとして、それぞれの方法のポイントをまとめます。
Struts管理のポイント
- 接続設定はstruts-configで行う
- WEB-INF/libに、JDBCドライバ、commons-dbcp、commons-collection、commons-poolが必要
- ActionのgetDataSourceメソッドでDataSourceを取得
- サンプルプログラムStruts-DB1が実装例
APサーバ管理のポイント
- 接続設定はAPサーバの機能で行う(APサーバごとに方法は違う)Tomcatの場合は、server.xmlで行う
- JDBCドライバはAPサーバに用意する(APサーバごとに方法は違う)Tomcatの場合は、common/libにJARファイルを配置
- JNDI経由でDataSource取得(サンプル参照のこと)
- サンプルプログラムStruts-DB2が実装例