1.C3P0 简介
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
C3P0的数据库连接池的核心类是ComboPooledDataSource
使用C3P0需要在工程中导入的jar包
c3p0-0.9.2-pre5\lib下有三个jar包,如果使用MySQL数据库,只需导入c3p0-0.9.2-pre5.jar,mchange-commons-java-0.2.3两个包即可,另外一个c3p0-oracle-thin-extras-0.9.2-pre5.jar供Oracle数据库使用.
2.代码实现
方式一,与DBCP代码实现类似,使用ComboPooledDataSource自身的API实现对数据库连接池的属性进行配置.
import java.sql.*; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Utils { //1 准备一个连接池 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); static{ //设置参数 try { //1.1 数据库连接基本4项 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day17"); dataSource.setUser("root"); dataSource.setPassword("fujianyi"); //1.2 连接池的特性 // * 初始化个数 dataSource.setInitialPoolSize(10); // * 最大数 dataSource.setMaxPoolSize(20); // * 最小数 dataSource.setMinPoolSize(5); // * 每次增加量 dataSource.setAcquireIncrement(3); } catch (Exception e) { throw new RuntimeException(e); } } public static Connection getConnection() throws SQLException{ return dataSource.getConnection(); } }
方式二,使用C3P0的配置文件c3p0-config.xml,对数据库连接池进行设置,在创建ComboPooledDataSource对象时,将配置文件中<named-config name="XXX">name属性的值作为字符串参数传入,即可完成配置文件的自动加载,配置文件同样需要放在classpath路径下,即src路径.
import java.sql.Connection; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Utils2 { private static ComboPooledDataSource dataSource; static{ dataSource = new ComboPooledDataSource("XXX"); } public static Connection getConnection() throws SQLException{ return dataSource.getConnection(); } }
关于配置文件
首先配置文件的名必须为c3p0-config.xml,且必须放在classpath路径下,其格式及内容如下,
<c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</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> <user-overrides user="test-user"> <property name="maxPoolSize">10</property> <property name="minPoolSize">1</property> <property name="maxStatements">0</property> </user-overrides> </default-config> <!-- 命名的配置 --> <named-config name="XXX"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day17</property> <property name="user">root</property> <property name="password">fujianyi</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <property name="initialPoolSize">20</property> <property name="minPoolSize">10</property> <property name="maxPoolSize">40</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>