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を照会して使うことができます。

JDBC and Swing Top

(first uploaded 2003/06/08 last updated 2006/02/21, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル