DBCP连接池和C3P0连接池

DBCP连接池和C3P0连接池

    由于建立数据库连接是一个非常耗时耗资源的行为,所以连接池的功能主要是系统初始运行时,主动建立足够的连接,组成一个池,用池来管理连接Connection。每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是把连接归还池,这样就可以重用这个连接了。
    常用的连接池有两种:DBCP连接池和C3P0连接池。

1,DBCP连接池

1.1,所需jar包

这里写图片描述

1.2,dbcpconfig.properties文件的基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbutils_test
username=root
password=1234

注意:url中的”dbutils_test”是数据库的名字,也就是要连接到哪个数据库。
Properties类用于读取properties文件,所以该配置文件的后缀要为”.properties”,
使用该类可以以类似Map的形式读取配置文件中的内容,Properties文件中的内容格式类似:username=root,等号左边就是key,等号右边就是value。
dbcpconfig.properties文件放在src目录下即可。

1.3,连接池工具类DBCPUtils

    在连接池工具类中,我们通过加载读取刚才的properties配置文件来连接数据库,把这部分可以写在静态代码块当中,当类加载的时候加载静态代码块,而且只加载一次。连接池工具类中除了连接数据库还要提供一个获取数据源DateSource和获取连接的方法。

package com.test.utils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtils {
    private static DataSource dataSource = null;
    static {
        Properties prop = new Properties();
        //加载配置文件
        InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
        try {
            prop.load(is);
            dataSource = BasicDataSourceFactory.createDataSource(prop);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource() {
        return dataSource;
    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

2,C3P0连接池

2.1,所需jar包

这里写图片描述

2.2,c3p0-config.xml文件的基本配置
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <!-- 四个基本配置 -->
        <property name="user">root</property>
        <property name="password">1234</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/dbutils_test</property>

        <!-- 其他配置 -->
        <!--连接池中保留的最大连接数,Default: 15 -->
        <property name="maxPoolSize" value="100" />
        <!--连接池中保留的最小连接数-->
        <property name="minPoolSize" value="1" />
        <!--初始化时获取的连接数,Default: 3 -->
        <property name="initialPoolSize" value="10" />
        <!--最大空闲时间,60秒内未使用则连接被丢弃,若为0则永不丢弃,Default: 0 -->
        <property name="maxIdleTime" value="30" />
        <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数,Default: 3 -->
        <property name="acquireIncrement" value="5" />
        <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量,
            但由于预缓存的statements属于单个connection而不是整个连接池,
            所以设置这个参数需要考虑到多方面的因素,
            如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭,
            Default: 0-->
        <property name="maxStatements" value="0" />

        <!--每60秒检查所有连接池中的空闲连接,Default: 0 -->
        <property name="idleConnectionTestPeriod" value="60" />

        <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
        <property name="acquireRetryAttempts" value="30" />

        <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,
            但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接,
            如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。
            Default: false-->
        <property name="breakAfterAcquireFailure" value="true" />

        <!--因性能消耗大请只在需要的时候使用它,如果设为true那么在每个connection提交的
            时候都将校验其有效性,建议使用idleConnectionTestPeriod或automaticTestTable
            等方法来提升连接测试的性能。Default: false -->
        <property name="testConnectionOnCheckout"  value="false" /> 
    </default-config> 
</c3p0-config> 

注意:c3p0-config.xml是自动查找的,不用通过类加载的方式,所以该配置文件的名字不能更改,放在src下即可。

2.3,连接池工具类C3P0Utils
package com.test.utils;

import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    public static ComboPooledDataSource getDataSource() {
        return dataSource;
    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

3,小结

    不管是使用以上哪个连接池,都应该在连接池的工具类当中对外提供数据源DataSource和连接Connection。比如说,当我们操作数据库使用到DbUtils工具类库的时候,就会使用到QueryRunner类,如下:
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
我们就需要参数”C3P0Utils.getDataSource()”或者”DBCPUtils.getDataSource()”来获取数据源,然后用queryRunner的相关方法去执行SQL语句。我们还可以直接通过C3P0Utils.getConnection()或者DBCPUtils .getConnection()来获取数据库的连接。

    DataSource是sun公司为java和数据库连接提供的一种接口规范,比如原生的jdbc连接;
    BasicDataSource是dbcp封装了jdbc对dataSource接口的实现;
    ComboPooledDataSource是c3p0封装了jdbc对DataSource接口的实现。

4,二者区别

    C3P0是一个开源的JDBC连接池,目前使用它的开源项目有Hibernate,Spring等。
    DBCP(DataBase connection pool),数据库连接池。是 Apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
单独使用dbcp需要3个包:
commons-dbcp.jar //连接池的实现
commons-pool.jar //连接池实现的依赖库
commons-collections.jar //通用集合库

DBCP没有自动的去回收空闲连接的功能,C3P0有自动回收空闲连接功能 ;
两者主要是对数据连接的处理方式不同:
C3P0提供最大空闲时间,DBCP提供最大连接数。
C3P0当连接超过最大空闲连接时间时,当前连接就会被断掉;
DBCP当连接数超过最大连接数时,所有连接都会被断开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值