web项目--c3p0

来源:互联网 发布:网络电视盒价格 编辑:程序博客网 时间:2024/06/05 03:01



如果一个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();
  }
 }

}
-----------------------------------------------------
其实最好的方式是用一个工厂模式,实现多个数据源连接的随便取