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方法进行扩展,将不用的连接放回连接池中。
来源:https://www.cnblogs.com/pokid/p/5818933.html