Jakarta TomcatにおけるDBCPを使った接続ぷーリング |
Jakarta Tomcatのバージョン4.1以降では、
その上で動作するところのWebアプリケーションがデータベース接続に利用するJDBCドライバの機能に関係なく、
データベース接続ぷーリングが行えるようになっています。
これは、同じJakartaプロジェクトが開発しているパッケージ、
Jakarta Commons DBCP
をTomcatに同梱することで実現しています。
$CATALINA_HOME/common/lib の下に、commons-dbcp.jar
というJARアーカイブがあると思いますが、これがそのご本尊です。
(commons-dbcpを使うにはcommons-logging-api.jar、commons-collections.jar、
commons-pool.jarも必要とします。これらも同じ位置にあるはずです)
接続ぷーリングを有効にするには、$CATALINA_HOME/conf/server.xml で、
Webアプリケーションに対して(またはグローバルブロックで)
リソースを下のように定義することで行います。
この例では、MySQLのデータベース(URI=jdbc:mysql://localhost/udb)に対して接続します。
<Context path="/app02" docBase="C:/usr/javadeploy/app02" debug="0"
reloadable="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="app02." suffix=".txt" timestamp="true"/>
<Resource name="jdbc/pmudb" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/pmudb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter><name>maxActive</name><value>50</value></parameter>
<parameter><name>maxIdle</name><value>20</value></parameter>
<parameter><name>maxWait</name><value>20000</value></parameter>
<parameter><name>username</name><value>urano</value></parameter>
<parameter><name>password</name><value>urano398</value></parameter>
<parameter><name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value></parameter>
<parameter><name>url</name>
<value>jdbc:mysql://localhost/udb</value></parameter>
<parameter><name>removeAbandoned</name>
<value>true</value></parameter>
<parameter><name>removeAbandonedTimeout</name>
<value>600</value></parameter>
<parameter><name>logAbandoned</name>
<value>true</value></parameter>
</ResourceParams>
</Context>
|
詳しくはTomcatのドキュメント「DataSource HOWTO」を見ていただくとして、
簡単にパラメータについて触れると、
maxActive、maxIdle、maxWaitはプールの数や動作に関する指定です。(ていうか、ホンマに簡単やな…)
usernameからurlまでは通常のデータベースリソースと同じなのでよいとして、
最後の3つ、removeAbandonedとremoveAbandonedTimeout、logAbandonedは、Webアプリケーションで
ResultSet、Statement、またはConnectionの使用が終了したときに
close()し忘れる不具合があったときに、これをTomcatが自動的に解放して救済する仕組みです。
removeAbandonedTimeoutの単位は秒で、
上の場合は接続が終了して10分経つと自動的に接続がプールに回収されます。
一方、Webアプリケーションの側は何も書かなくても動作しますが、
$APP_HOME/WEB-INF/web.xml にこのアプリケーションはこのリソースを使うのです、
とコンテナに知らせる記述をするのが正しいお作法です。というわけで次のように。
<resource-ref>
<description>MySQL DB Connection (using DBCP)</description>
<res-ref-name>jdbc/pmudb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
|
これで、WebアプリケーションからはJNDI名
「java:comp/env/jdbc/pmudb」で接続プールされたDataSourceを照会して使うことができます。
(first uploaded 2003/06/08 last updated 2006/02/21, URANO398)
|