一、什么是C3P0
我们开始实现了一个自定义的连接池,那么C3P0连接池和我们自定义那个就差不多了,只是它是一个开源的,比我们自己实现的要强大很多的连接池。下面为百科上的定义:
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
二、如何使用C3P0
首先我们先要引入C3P0的jar包,(当然连接mysql是少不了mysql的驱动包的),我这里因为使用的Maven,就直接引入到pom文件中了
<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
然后我们使用的时候就直接new出ComboPooledDataSource对象就可以了 ,然后去设置它的一些需要连接数据库的参数,如下:
ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"); dataSource.setUser("root"); dataSource.setPassword("root");
那么,一个最简单的C3P0就可以使用了,我们就可以像JDBC那样去获得连接,使用连接了,完整测试代码如下:
public static void main( String[] args ) throws SQLException, PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"); dataSource.setUser("root"); dataSource.setPassword("root"); Connection conn = dataSource.getConnection(); String sql = "select * from user where u_id = ?"; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); ps.setInt(1, 1); rs = ps.executeQuery(); while (rs.next()) { System.out.println("id="+rs.getInt(1)); System.out.println("username="+rs.getString(2)); System.out.println("password="+rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils_V3.close(conn, ps, rs);//这是本人自己封装的一个关闭资源的方法,非C3P0所提供 } }
OK,一个简单的C3P0使用测试案例就完成了,但是,为了避免硬编码,C3P0提供对配置文件的引入,支持xml,和properties文件,我这里就使用xml文件,properties不做介绍
文件如下:
<?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/test</property> <property name="user">root</property> <property name="password">root</property> <!-- 初始化连接池的连接数 --> <property name="initialPoolSize">5</property> <!-- 连接池中最大的连接数 --> <property name="maxPoolSize">20</property> </default-config> <!-- 当需要使用这里的配置时只需要在创建对象的时候传入这个的name值,即oracle --> <named-config name="oracle"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///web_07</property> <property name="user">root</property> <property name="password">123</property> </named-config> </c3p0-config>
其中注释都已经很清楚,值得注意的是,C3P0默认配置文件的路径是在classpath下,且文件名必须为c3p0-config.xml;当然,C3P0的配置不会这么简单,还有很多配置项是可以去配置优化的,详细可以去官网查看文档介绍,会更好。
配置文件方式的测试代码如下:
public static void main( String[] args ) throws SQLException, PropertyVetoException { //因为有配置文件存在且在类路径下,所以创建此对象的时候就会去加载默认路径下名为c3p0-config.xml的配置文件 ComboPooledDataSource dataSource = new ComboPooledDataSource(); // dataSource.setDriverClass("com.mysql.jdbc.Driver"); // dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"); // dataSource.setUser("root"); // dataSource.setPassword("root"); Connection conn = dataSource.getConnection(); String sql = "select * from user where u_id = ?"; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); ps.setInt(1, 1); rs = ps.executeQuery(); while (rs.next()) { System.out.println("id="+rs.getInt(1)); System.out.println("username="+rs.getString(2)); System.out.println("password="+rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils_V3.close(conn, ps, rs);//这是本人自己封装的一个关闭资源的方法,非C3P0所提供 } }
OK,c3p0的使用就这样了 。