c3p0数据源的使用

核能气质少年 提交于 2020-02-14 14:03:22

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

c3p0与dbcp区别:

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

c3p0有自动回收空闲连接功能。

 

c3p0的实现由三种方式,

一种手动在方法里添加数据库连接,即在setter方法里传数据库连接和配置的参数

一种自定义properties文件或XML文件,配置相关数据库信息,然后手动解析

一种定义默认的配置文件,properties文件为c3p0.properties,XML文件为c3p0-config.xml

使用默认的配置文件c3p0会自动帮我们解析,只需把参数传入配置文件就可以使用了,相当方便

这里简单介绍下第三种使用默认配置文件的用法,以xml文件为例

配置文件c3p0-config.xml(只配置了一些必须的参数,更多可配置参数参看官方文档)

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/blogs_stu</property>
        <property name="user">root</property>
        <property name="password"></property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config> 
    <named-config name="intergalactoApp">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/blogs_stu</property>
        <property name="user">root</property>
        <property name="password"></property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </named-config>
</c3p0-config>

工具类C3P0Util

public class C3P0Util {
    private static ComboPooledDataSource cpds=new ComboPooledDataSource();
    public static Connection getConnection(){
        try {
            return cpds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void release(Connection conn,Statement stmt,ResultSet rs){
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn=null;
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt=null;
        }
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs=null;
        }
    }
}

可以看到C3P03的使用相当简单

打印通过c3p0方式获取的Connection对相关

public class Test6{
    public static void main(String[] args) throws SQLException  {
        Connection conn=C3P0Util.getConnection();
        System.out.println(conn.getClass().getName());
    }

通过名字容易发现,与dbcp的装饰模式不用,c3p0使用的方式是代理模式,通过代理类对close方法进行扩展,将不用的连接放回连接池中。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!