2008-10-26

如何在 Tomcat 中運用 JNDI 的方式取得 C3P0 的 connection pool

Tomcat 本來內建的 connection pool 是 dbcp,但據說有一堆 bug 沒解,因此想說要把 DBCP 換成 c3p0 以避免這些問題。剛好在網路上看到這個解法,就將它記下來嚕。

首先當然是要先把 c3p0 的 jar 檔及 jdbc driver 放到 tomcat 的 lib 目錄下。

Tomcat 5.0

在 Tomcat 的目錄下 conf/server.xml ,找到 <Context> 修改其內容:

<Resource name="jdbc/pooledDS" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" /> <ResourceParams name="jdbc/pooledDS">
   <parameter>
      <name>factory</name>
      <value>org.apache.naming.factory.BeanFactory</value>
   </parameter>
   <parameter>
      <name>driverClass</name>
      <value>org.postgresql.Driver</value> 
   </parameter>
   <parameter>
      <name>jdbcUrl</name>
      <value>jdbc:postgresql://localhost/c3p0-test</value> 
   </parameter>
   <parameter>
       <name>user</name>
       <value>swaldman</value>
    </parameter>
    <parameter>
       <name>password</name>
       <value>test</value>
    </parameter>
    <parameter>
       <name>minPoolSize</name>
       <value>5</value>
    </parameter>
    <parameter>
       <name>maxPoolSize</name>
       <value>15</value>
    </parameter>
    <parameter>
       <name>acquireIncrement</name>
       <value>5</value>
    </parameter>
</ResourceParams>

Tomcat 5.5/6.0

在 Tomcat 的目錄下 conf/server.xml ,找到 <GlobalNamingResources> 加上其內容:

<Resource auth="Container"
        description="DB Connection"
        driverClass="com.mysql.jdbc.Driver"
        maxPoolSize="4"
        minPoolSize="2"
        acquireIncrement="1"
        name="jdbc/TestDB"
        user="test"
        password="ready2go"
        factory="org.apache.naming.factory.BeanFactory"
        type="com.mchange.v2.c3p0.ComboPooledDataSource"
        jdbcUrl="jdbc:mysql://localhost:3306/test?autoReconnect=true" />

Web.xml

標準 J2EE 的程式中,需要在 web.xml 中做以下設定:

<resource-ref>
   <res-ref-name>jdbc/pooledDS</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>

如何利用程式取得 DataSource

InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/pooledDS");

原文參考:http://www.mchange.com/projects/c3p0/index.html#tomcat-specific

沒有留言: