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方法进行扩展,将不用的连接放回连接池中。