JDBC 学习复习8 C3P0数据源使用

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

c3p0与dbcp区别

  • dbcp没有自动回收空闲连接的功能
  • c3p0有自动回收空闲连接功能

导入相关jar包
 c3p0-0.9.2-pre1.jar、mchange-commons-0.2.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-0.9.2-pre1.jar
在类目录下加入C3P0的配置文件:c3p0-config.xml
c3p0-config.xml的配置信息如下:
配置了3个 一个默认和 的是 msyql 的,还要一个oracle 有需自取 改下配置就可以了

<?xml version="1.0" encoding="UTF-8"?>
<!--
c3p0-config.xml必须位于类路径下面
private static ComboPooledDataSource ds;
static{
    try {
        ds = new ComboPooledDataSource("MySQL");
    } catch (Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}
-->

<c3p0-config>
    <!--
    C3P0的缺省(默认)配置,
    如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源
    -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/lieweb</property>
        <property name="user">root</property>
        <property name="password"></property>
        
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>

    <!--
    C3P0的命名配置,
    如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("Oracle");”这样写就表示使用的是name是MySQL的配置信息来创建数据源
    -->
    <named-config name="Oracle">
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="user">scott</property>
        <property name="password">tiger</property>
        
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>
    
     <!--
    C3P0的命名配置,
    如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource("MySQL");”这样写就表示使用的是name是MySQL的配置信息来创建数据源
    -->
    <named-config name="MySQL">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/libweb</property>
        <property name="user">root</property>
        <property name="password"></property>
        
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>

</c3p0-config>

使用C3P0的数据库 工具类代码如下

package dbex;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtil3 {
	
	private static ComboPooledDataSource ds = null;
	static{
		try {
			
			 //通过代码创建C3P0数据库连接池
            /*ds = new ComboPooledDataSource();
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/libweb");
            ds.setUser("root");
            ds.setPassword("");
            ds.setInitialPoolSize(10);
            ds.setMinPoolSize(5);
            ds.setMaxPoolSize(20);*/
			//通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下
			
			ds = new ComboPooledDataSource("MySQL");
			
		} catch (Exception e) {
			System.out.println(DBUtil3.class.toString()+":"+e.getMessage());
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @Title: geteConnection 
	 * @Description: 获取数据库连接
	 * @param @return
	 * @param @throws SQLException    
	 * @throws
	 */
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}
	/**
	 * 
	 * @Title: release 
	 * @Description:释放资源 
	 * @param     
	 * @throws
	 */
	public static void release(Connection conn,PreparedStatement ppst,ResultSet rs){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ppst!=null){
			try {
				ppst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * @throws SQLException 
	 * 
	 * @Title: main 
	 * @Description:最好写个 JUnit 测试类咯   @Test 的方式  可以参考我的博文 
	 * @param @param args    
	 * @throws
	 */
	 public static void main(String[] args) throws SQLException {
		 Connection conn=null;
			PreparedStatement ppst =null;
			ResultSet rs= null;
			
			conn =DBUtil3.getConnection();
			System.out.println(conn);
			ppst = conn.prepareStatement("select * from user");
			rs=ppst.executeQuery();
			while(rs.next()){
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2));
			}
			DBUtil3.release(conn, ppst, rs);
		}
}

测试效果-mysql

测试效果-oracle

posted @ 2017-12-03 01:33  言非言  阅读(261)  评论(0编辑  收藏  举报