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