如果一个web项目准备直接使用jdbc做数据库访问,往往是在tomcat或resin中配置数据源,然后在程序中调用。这样会在部署时去修改web容器的配置,另一个问题就是数据源日志的监视不能够随心所欲。最近又查看了一下c3p0的文档,想到可以再改进下我们现有web项目的连接配置。
首先我们把ojdbc.jar和c3p0.jar加入到项目lib中,然后在src/下放入c3p0-config.xml,最后在任意处使用new ComboPooledDataSource()获取数据源,当然我们也可以专门写个Helper类,把datasource置成静态变量进行调用,还可以在里面加些公用的数据库操作方法之类的。
下面看看具体的配置
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:oracle:thin:@192.168.10.161:1521:cjldata</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="user">xxx</property>
<property name="password">xxx</property>
<property name="acquireIncrement">1</property>
<property name="initialPoolSize">1</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
<property name="maxIdleTime">120</property>
<property name="acquireRetryAttempts">5</property>
<property name="maxStatements">0</property>
<property name="acquireRetryAttempts">10</property>
<property name="checkoutTimeout">10000</property>
<!-- this 2 property is used to test Connection leaks -->
<!--property name="unreturnedConnectionTimeout">10</property>
<property name="debugUnreturnedConnectionStackTraces">true</property-->
</default-config>
<named-config name="Db2">
<property name="jdbcUrl">jdbc:oracle:thin:@192.168.10.161:1521:cjldata</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="user">212</property>
<property name="password">123</property>
<property name="acquireIncrement">1</property>
<property name="initialPoolSize">1</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
<property name="maxIdleTime">120</property>
<property name="acquireRetryAttempts">5</property>
<property name="maxStatements">20</property>
<property name="acquireRetryAttempts">10</property>
<property name="checkoutTimeout">10000</property>
</named-config>
</c3p0-config>
DbHelper.java
public class DbHelper {
private static DbHelper instance = null;
synchronized public static DbHelper getInstance() {
if (instance == null) {
instance = new DbHelper();
}
return instance;
}
public static ComboPooledDataSource ds = null;
public DbHelper() {
ds = new ComboPooledDataSource();
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
======================================================================
1、unreturnedConnectionTimeout、debugUnreturnedConnectionStackTraces 这2个参数用来测试代码中未关闭连接的地方,也就是我们以前经常碰到的问题- -;上面的意思就是发现getConnection后超过10秒未交还连接的(也就是未执行conn.close)情况就把获取连接处的stack trace打出来。
2、name-config提供了在应用中使用多个数据库连接池的方式,很简单,如上例,我们只要使用 new ComboPooledDataSource("Db2")就可以使用配置文件中的第二个连接池了。
3、关于日志的监控也方便了许多。在log4j.xml中加入对com.mchange的控制即可。
例如:
<logger name="com.mchange" >
<level value="debug" />
</logger>
把数据库连接池的日志设为debug,能看到连接池日志输出情况
-----------------工作中用的--------------------------
package net.guodu.c3p0;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBManage {
private static DBManage instance = null;
synchronized public static DBManage getInstance() {
if (instance == null) {
instance = new DBManage();
}
return instance;
}
public static ComboPooledDataSource ds = null;
public DBManage() {
ds = new ComboPooledDataSource();
//或者 ds = new ComboPooledDataSource("name");
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void release() {
try {
if (ds != null) {
ds.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
-----------------------------------------------------
其实最好的方式是用一个工厂模式,实现多个数据源连接的随便取