连接池之-C3P0

2017-11-13  本文已影响19人  CoderHong

C3P0是一个开源的JDBC(sun公司定义的用于执行SQL语句的Java API)。目前使用它的有HibernateSpring等。

C3P0与dbcp区别

使用C3P0有两种方式

先说一下硬编码使用,记得导入jar包。

// C3p0
        // 1. 硬编码的方式
        ComboPooledDataSource datasource =new ComboPooledDataSource();
        datasource.setDriverClass("com.mysql.jdbc.Driver");
        datasource.setJdbcUrl("jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=utf8");
        datasource.setUser("root");
        datasource.setPassword("123456");
        
        // 使用dbutils操作SQL语句
        QueryRunner qr = new QueryRunner(datasource);
        
        String sql = "insert into users(id, username, PASSWORD) values(?, ?, ?);";
        
        Object[] params = {"100", "h", "10"};
        int row = qr.update(sql, params);
        System.out.println(row);

上面硬编码的方式需要手动设置数据库的的信息,开发中常使用配置文件的方式。

配置文件有两种方式,一种是.properties另一种是.xml。我们先看下文档


Snip20171113_13.png

上面的说的意思是:

c3p0.properties的配置:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=utf8
c3p0.user=root
c3p0.password=123456

c3p0-config.xml的配置

<c3p0-config>
  <default-config>

    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mybase?useUnicode=true&amp;characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        
        <!--  扩展配置-->
    <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>

  </default-config>

  <!-- 命名空间的配置-->
  <named-config name="coderhong"> 
    
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mybase?useUnicode=true&amp;characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password">123456</property>
  
    <property name="acquireIncrement">50</property>
    <property name="initialPoolSize">100</property>
    <property name="minPoolSize">50</property>
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property>

  </named-config>

对于c3p0-config.xml的配置说一下:
命名空间<named-config name="coderhong">重要是针对ComboPooledDataSource构造方法。

new ComboPooledDataSource(String configName);

该方法加载xml配置中指定的命名空间的c3p0的配置,如果项目中用了多种数据库可以用到。
提示:如果我们我们指定了命名空间,加载时发现没有,它会自动加载默认的配置。

我们可以自己封装一个基于c3p0的工具类:DataSourceUtils.class

public class DataSourceUtils {
    
    private static ComboPooledDataSource ds = new ComboPooledDataSource();
    
    
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    
    // 获取连接池
    public static DataSource getDataSource() {
        return ds;
    }
    
    public static void close(Connection conn, ResultSet set) {
        
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(set != null) {
            try {
                set.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    
}
上一篇下一篇

猜你喜欢

热点阅读