美文网首页
连接池之-C3P0

连接池之-C3P0

作者: CoderHong | 来源:发表于2017-11-13 00:38 被阅读19次

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

    C3P0与dbcp区别

    • dbcp没有自动回收空闲连接的功能
    • c3p0有自动回收空闲连接功能
    • 在导入jar包C3P0只需要一个jar包,dbcp需要两个jar包。

    使用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-config.xml或者从c3p0.properties
    • 配置的文件在class文件的最顶层既工程src目录下。

    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();
                }
            }
        }
        
        
    }
    

    相关文章

      网友评论

          本文标题:连接池之-C3P0

          本文链接:https://www.haomeiwen.com/subject/cnkamxtx.html