
Tomcat 7の新機能で何ができるようになるのか?(番外編)
Commons DBCPを超えるTomcat JDBC Poolとは
NTT OSSセンタ
藤野圭一(Apache Tomcat コミッタ)
2011/11/7
TomcatのDBコネクション・プールは2つある
@IT読者の皆さんは「Tomcat JDBC Connection Pool」をご存じですか? 通常、TomcatのDBコネクション・プールといえばApache Commonsプロジェクトの「Commons DBCP」を想像するかと思います。しかし、Tomcatには「Commons DBCP」以外にもDBコネクション・プールの実装が存在します。それが、「Tomcat JDBC Connection Pool」(以下、Tomcat JDBC Pool)です。
Tomcat JDBC Poolとは、Apache Tomcatプロジェクトが独自に作成したDBコネクション・プールの実装のことです。
実は、このTomcat JDBC Poolは数年前から開発されていて、Tomcat 7.0.18以前ではソースファイルから「extra」パッケージとして別途ビルドすることで利用可能でした。そして、Tomcat 7.0.19から正式にTomcatのバイナリパッケージに含まれることになりました。
つまりTomcat 7では、標準で2つのDBコネクション・プールの実装が利用可能で利用者はどちらか好きな実装を選べます。
本稿では、Tomcat 7.0.19から正式に採用されたTomcat JDBC Poolについて、Commons DBCPとの違いをベースに説明します。
Tomcat JDBC Poolのコンフィグレーション
まずはコンフィグレーションについて説明します。Tomcat JDBC Poolでは、いくつか例外はありますが、基本的にCommons DBCPと同様の設定で利用可能です。
パラメータの種類別にカテゴライズしてみました。順に説明します。
■ 共通設定パラメータ
まずはJDBC Driverに関するパラメータやトランザクションやコミットモードなどの基本パラメータについてです。以下の表にまとめました。
|
基本的にはDBCPとTomcat JDBC Pool間で同様に利用できます。ただし、defaultAutoCommitについてはデフォルトの意味がDBCPと異なります。defaultAutoCommitが未設定の場合、DBCPはtrueが設定されますが、Tomcat JDBC PoolはJDBC Driverのデフォルトが利用されます。つまり未設定の場合、setAutoCommitメソッドは呼び出されません、
もう一点、JDBCドライバの配置場所についてDBCPとTomcat JDBC Pool では違いがあります。
DBCP(1.3や1.4以降)の場合はTomcat共通の「lib」ディレクトリでも、Webアプリケーションの「WEB-INF/lib」でも、どちらにJDBCドライバを配置しても構いませんが、Tomcat JDBC Poolの場合は「tomcat-jdbc.jar」をロードするクラスローダが読めるディレクトに配置しないといけません。デフォルトの場合は、Tomcat共通のlibディレクトリになります。
■ コネクションプールに関するパラメータ
次は、コネクションプールの初期サイズや最大コネクション数などのコネクションプールに関するパラメータです。
|
initialSize、maxActive、maxIdle、minIdle、maxWaitについてはデフォルト値に違いはありますが、DBCP と Tomcat JDBC Pool の間で同様に利用できます。
なお、上記表にも記載していますが、「maxAge」によるコネクションの生存期間チェックと「fairQueue」によるアイドルコネクションリストの実装の切り替えが新機能として新たに追加されています。
■ バリデーションに関するパラメータ
次は、バリデーションに関するパラメータです。DBサーバへ指定したタイミングでSQLクエリを発行し、コネクションの有効性を確認できます。
|
コネクションのバリデーションについては、DBCP と同様に Tomcat JDBC Pool でも利用可能です。Tomcat JDBC Poolの場合は、従来のtestOnBorrow、testOnReturn、testWhileIdleでのタイミングに加えて、initSQLによるコネクション作成時のバリデーションも行えるようになりました。
さらに、validationIntervalによるバリデーション間隔の調整によって、過剰なコネクションのバリデーションを抑制できます。
また、validatorClassNameの指定によりコネクションの検証処理をJavaクラスとしてプログラミングできるようになり、validationQueryの実行だけではできないような複雑なコネクションの検証ができます。
Validatorを作成するには、「org.apache.tomcat.jdbc.pool.Validatorをimplements」して、「validate(Connection con, int validateAction)」メソッドを実装するだけです。validateメソッドにオリジナルのコネクションチェック処理を記述してください。
public class TestValidator implements Validator {
@Override
public boolean validate(Connection con, int validateAction) {
// validate connection
return result;
}
}
■ PreparedStatementのキャッシュに関するパラメータ
DBCPで設定可能であったPreparedStatementのキャッシュに関する以下のパラメータは、Tomcat JDBC Poolでは利用できません。PreparedStatementのキャッシュをTomcat JDBC Poolで利用するには、後述するJdbcInterceptorを使用します。
|
■ アイドル状態のコネクションに関するパラメータ「Eviction」
アイドル状態のコネクションに関するパラメータは以下の通りです。
|
変更点は、numTestsPerEvictionRunが利用不可になったことだけです。timeBetweenEvictionRunsMillisとminEvictableIdleTimeMillisは従来と同様に利用できます。
■ コネクションのクローズ漏れ検知のパラメータ「removeAbandoned」
次は、コネクションのクローズ漏れ検知の設定です。プールから貸し出されたコネクションが長時間の間、クローズされなかった場合に、クローズ漏れとして検知して、ログ出力後(有効なら)、コネクションをクローズします。
|
Tomcat JDBC Pool では従来のremoveAbandoned機能に加えて、 suspectTimeoutとabandonWhenPercentageFullが新規で追加されています。
■ その他
最後に、どのカテゴリにも属さない、その他のパラメータです。
|
accessToUnderlyingConnectionAllowed以外は全て新規パラメータです。
dataSourceやdataSourceJNDIなどのコネクション取得先をデータソースから取得できるようにした拡張や、useEqualsやuseLockの内部実装の細かい追加までさまざまな種類があります。中でも「jdbcInterceptor」「jmxEnabled」は大きな拡張の1つなので、次ページで詳しく説明します。
1-2 |
| Index | ||||||
|
||||||
Tomcat 7の新機能で何ができるようになるのか? バックナンバー 連載インデックスへ»
- 第1回 Tomcat 7も対応したServlet 3.0の6つの主な変更点
- 第2回 Tomcat 7も対応したServlet 3.0の変更点 後編
- 第3回 技術者が知っておきたいTomcat 7の新機能20連発
- 最終回 Commons DBCPを超えるTomcat JDBC Poolとは
| Java Solution全記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -

