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
    评论
好的,我会回答你的问题,以下是常用数据库连接池 DBCPc3p0、Druid 的配置说明: 1. DBCP (Apache Commons DBCP) DBCP 是 Apache Commons 项目中的一个子项目,它是一个纯 Java 实现的数据库连接池DBCP使用非常简单,只需要引入相关的 jar 包即可。以下是 DBCP 的配置说明: ``` # 最大连接数 maxActive=100 # 最大空闲连接数 maxIdle=30 # 最小空闲连接数 minIdle=10 # 获取连接时的最大等待时间,单位为毫秒 maxWait=10000 # 是否开启自动回收空闲连接的线程 removeAbandoned=true # 回收超时时间,单位为秒 removeAbandonedTimeout=180 # 是否开启缓存 PreparedStatement,提高性能 poolPreparedStatements=true # 缓存 PreparedStatement 的最大数量 maxOpenPreparedStatements=100 ``` 2. c3p0 c3p0 是一个开源的 JDBC 数据库连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 的 Connection 和 Statement 缓存以及 JDBC4 的自动化管理。以下是 c3p0 的配置说明: ``` # 最大连接数 c3p0.maxPoolSize=100 # 最小连接数 c3p0.minPoolSize=10 # 初始化连接数 c3p0.initialPoolSize=10 # 获取连接时的最大等待时间,单位为毫秒 c3p0.checkoutTimeout=10000 # 是否自动回收超时连接 c3p0.autoCommitOnClose=true # 是否开启自动回收空闲连接的线程 c3p0.idleConnectionTestPeriod=60 # 回收超时时间,单位为秒 c3p0.maxIdleTime=1800 # 是否开启缓存 PreparedStatement,提高性能 c3p0.cachePreparedStatements=true # 缓存 PreparedStatement 的最大数量 c3p0.maxStatements=100 ``` 3. Druid Druid 是阿里巴巴开源的一个高性能、可扩展、功能强大的数据库连接池。它主要提供了以下功能:监控统计、防御 SQL 注入、批量处理、数据源加密、日志记录等。以下是 Druid 的配置说明: ``` # 最大连接数 druid.maxActive=100 # 最大空闲连接数 druid.maxIdle=30 # 最小空闲连接数 druid.minIdle=10 # 获取连接时的最大等待时间,单位为毫秒 druid.maxWait=10000 # 是否开启自动回收空闲连接的线程 druid.removeAbandoned=true # 回收超时时间,单位为秒 druid.removeAbandonedTimeout=180 # 是否开启缓存 PreparedStatement,提高性能 druid.poolPreparedStatements=true # 缓存 PreparedStatement 的最大数量 druid.maxOpenPreparedStatements=100 # 是否开启 SQL 执行监控 druid.stat=true # 是否开启防御 SQL 注入功能 druid.filters=stat,wall,log4j ``` 以上就是常用数据库连接池 DBCPc3p0、Druid 的配置说明。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值