C3P0连接池的使用

Posted samluby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C3P0连接池的使用相关的知识,希望对你有一定的参考价值。

一、什么是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的使用就这样了 。

以上是关于C3P0连接池的使用的主要内容,如果未能解决你的问题,请参考以下文章

c3p0数据库连接池的使用详解

C3P0连接池操作数据库

c3p0,dbcp与druid 三大连接池的区别[转]

C3P0连接池的使用

c3p0连接池的使用

C3P0属性设置和数据库连接池的获取