JDBC之连接池DBCP与c3p0的简单使用

JDBC之连接池DBCP与c3p0的简单使用

提示:本内容通过慕课网学习后写的笔记

一、背景

数据库是一种重要的资源,我们普通的做法是使用直连方法连接数据库,使用完毕后关闭连接。
假如部署了一个很大的项目,访问量很大,如果使用直接连接方式每个客户端连接都会创建一个连接,
这样频繁的数据库连接方式会给数据库很大的压力,这样很容易导致数据库崩溃,然后项目网站也就瘫痪了。
正是针对这样的问题,出现了数据库连接池技术。

数据库连接池技术的大致思路:

我们使用连接池技术先创建好一定数量的连接,即连接池中保持一定数量的连接,当需要使用的时候,从连接池中取出一个连接,
当使用完成后,释放连接,放回连接池,当连接用户请求连接数比较大,连接池中的连接不够用的时候,再用户等待。

连接池中保持一定数量的连接:

这里写图片描述

请求人数过多等待:
这里写图片描述

二、常用的开源数据库连接池

2.1 dbcp

步骤:

  1. 导入相关jar包
    commons-dbcpxxx.jar
    commons-poolxxx.jar
    commons-loggingxxx.jar
    提示:jar包可以去http://mvnrepository.com/下载
  2. 在项目的src文件夹下增加配置文件
    dbcp.properties
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=myoracle
password=myoracle
maxActive=30
maxIdle=10
minIdle=1
maxWait=10000
initialSize=5
removeAbandoned=true
removeAbandonedTimeout=300
  1. dbcp.properties文件内容的字段说明
属性名属性描述属性值
driverClassName使用的JDBC的完整的有
效的java类名称
com.mysql.jdbc.Driver
url传递给JDBC驱动的用于建立连接的urljdbc:mysql://localhost:3306/test?
useUnicode=true&characterEncoding=UTF-8
username传递给JDBC驱动用于建立连接的用户名myoracle
password传递给JDBC驱动用于建立连接的密码myoracle
maxActive最大活动连接数:连接池在同一时间能够
分配的最大活动连接的数量,
如果设置为非正数,则表示不受限制
30
maxIdle最大空闲连接数:连接池中容许保持最大
空闲状态的最大链接数量,操作的空闲连接将被释放,
如果设置为负数表示不受限制
10
minIdle最小空闲连接数:连接池中容许保持最小
空闲状态的最大链接数量,操作的空闲连接将被释放,
如果设置为负数表示不受限制
1
maxWait最大等待时间:当没有可用连接时,连接池等待
连接被归还的最大(以毫秒计数),超过时间则抛出异常,
如果设置为-1则表示无限等待
1000
initialSize初始连接:池启动时创建的连接数量1
logAbandoned连接被泄露时是否打印true
removeAbandoned是否自动回收超时连接true
removeAbandoned Timeout超时时间(以秒数为单位)10
timeBetweenEvictionRunsMillis在空闲连接回收器线程运行期间休眠的时间值,
以毫秒为单位
1000
numTestsPerEvictionRun在每次空闲连接回收器线程(如果有)运行时检查的连接数量10
minEvictableIdleTimeMillis连接在池中保持空闲而不被空闲连接回收器线程10000

推荐文章:http://bsr1983.iteye.com/blog/2092467

使用案例:

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.omg.CORBA.Object;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Description:使用dpcp连接池连接数据库
 *
 * @author caojx
 *         Created by caojx on 2017年04月06 下午11:06:06
 */
public class DBCPUtil {

    /**
     * 数据源
     */
    private static DataSource DS;

    private static String configFile = "/dbcp.properties";

    /**
     * @return
     * @Description: 从数据源获取一个连接
     */
    public Connection getConnection() {
        Connection connection = null;
        if (DS != null) {
            try {
                connection = DS.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                connection.setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return connection;
        }
        return connection;
    }

    /**
     * 默认的构造函数
     */
    public DBCPUtil() {
        this.initDbcp();
    }

    /**
     * @Description: 方式一,DBCP通过读取配置文件获取参数后,通过BasicDataSourceFactory获取DataSource
     */
    private static void initDbcp() {
        Properties properties = new Properties();
        try {
            properties.load(Object.class.getResourceAsStream(configFile));
            DS = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 构造函数,初始化了DS,指定数据库
     */
    public DBCPUtil(String connectURI) {
        initDS(connectURI);
    }

    /**
     * 构造函数,初始化DS,制定所有参数
     */
    public DBCPUtil(String connectURI, String username, String password, String driverClass,
                    int initialSize, int maxActive, int maxIdle,
                    int maxWait, int minIdle) {
        initDS(connectURI, username, password, driverClass, initialSize, maxActive, maxIdle, maxWait, minIdle);

    }

    /**
     * @param connectURI 数据库
     * @return
     * @Description 创建数据源,除了数据库外,都使用默认的参数
     */
    public static void initDS(String connectURI) {
        initDS(connectURI, "myoracle", "myoracle", "oracle.jdbc.driver.OracleDriver", 5, 30, 10, 1, 1000);
    }

    /**
     * @param connectURI
     * @param username
     * @param password
     * @param driverClass
     * @param initialSize
     * @param maxActive
     * @param maxIdle
     * @param maxWait
     * @param minIdle
     * @Description: 方式二,手动给创建DataSource,并给其设置参数
     */
    public static void initDS(String connectURI, String username, String password, String driverClass,
                              int initialSize, int maxActive, int maxIdle,
                              int minIdle, int maxWait) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(connectURI);
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxTotal(maxActive);
        dataSource.setMaxIdle(maxIdle);
        dataSource.setMaxWaitMillis(maxWait);
        dataSource.setMinIdle(minIdle);
        DS = dataSource;
    }


    public static void main(String[] args) {

        System.out.println(new DBCPUtil().getConnection());
    }

}

注意:如果jdbc驱动包使用不对,会出现如下错误,更换jdbc包后可解决。
这里写图片描述

2.2 c3p0

官网:http://www.mchange.com/projects/c3p0/
c3p0是一个开源的JDBC连接池,他实现了数据源和JNDI绑定,支持JDBC3和JDBC2的标准扩展。

步骤:

  1. 导入相关的jar包
    c3p0-0.9.5.2.jar
    mchange-commons-java-0.2.10.jar
    c3p0-oracle-thin-extras-0.9.5.jar(oracle专用jar)
    提示:jar包可以去http://mvnrepository.com/下载

  2. 在项目的src文件夹下增加配置文件
    c3p0.properties

c3p0.driverClass=oracle.jdbc.driver.OracleDriver
c3p0.jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:XE
c3p0.user=myoracle
c3p0.password=myoracle

其他配置参数:
http://blog.csdn.net/yixiayizi/article/details/8277424
http://www.mchange.com/projects/c3p0/

  1. 编写类文件,创建连接池
import com.mchange.v2.c3p0.ComboPooledDataSource;

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

/**
 * Description: 测试c3p0连接池
 * 
 * Created by caojx on 2017年04月07 上午12:26:26
 */
public class C3P0Util {

    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    public static Connection getConnection() {
        try {
            return  dataSource.getConnection();
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }
    }

    public static void main(String[] args){
        System.out.println(C3P0Util.getConnection());
    }
}

三、dbcp与c3p0对比

这里写图片描述

推荐文章:
http://bsr1983.iteye.com/blog/2092467
http://blog.csdn.net/yixiayizi/article/details/8277424

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值