DBCP

分类 说明
名称 DBCP
全称 Database Connection Pool
功能 数据库连接池

连接池

数据库连接池是一种关键有限且昂贵的资源,对数据库连接的管理能显著影响整个应用程序的伸缩性和健壮性,是影响程序的性能指标。

数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。通过释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引发的数据库连接遗漏。

数据库连接池的基本思想是在系统初始化时,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。当使用完毕后,用户也并非将连接关闭,而是将连接放回到连接池中,供下一个请求访问使用。因此连接的建立、断开都是由连接池自身来管理的。同时,可通过设置连接池参数来控制连接池中初始连接数,连接的上下限数、每个连接的最大使用次数、最大空闲时间等,通过自身的管理机制来监视数据库连接的数量和使用情况等。

DBCP

  • DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池
  • DBCP是一个开源的连接池,是Apache Common成员之一,企业开发中常见,是Tomcat内置的连接池。
  • Spring开发组推荐使用DBCP,阿里的Druid也是参照DBCP开发而来的。
  • DBCP支持通过JNDI获取数据库,并支持JTA或XA事务中用于2PC(两阶段提交)的连接对象。

下载地址 http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
配置参数 http://commons.apache.org/proper/commons-dbcp/configuration.html
接口文档 https://tool.oschina.net/apidocs/apidoc?api=dbcp

依赖

Maven项目导入DBCP依赖

$ vim pom.xml
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.6.0</version>
</dependency>

commons-dbcp2包依赖于commons-pool2包提供的底层对象池机制。

DBCP现有三种不同版本,支持不同版本的JDBC。

DBCP JDBC Java
DBCP2 JDBC4.1 Java7
DBCP1.4 JDBC4 Java6
DBCP1.3 JDBC3 Java1.4.5

使用步骤

  1. 创建配置文件dbcp.properties用于设置数据库连接参数和连接池参数等。
  2. 使用BasicDataSourceFactory加载dbcp.properties文件以获取BasicDataSource对象
  3. 使用BasicDataSource对象获取Connection连接对象
  4. 使用Connection连接对象对数据表操作

配置文件

$ vim resources/dbcp.properties
#连接基本属性
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/fw?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
connectionProperties=useUnicode=true;characterEncoding=utf8
username=root
password=root

#连接池大小和连接超时参数
initialSize=0
maxTotal=8
maxIdle=8
minIdle=0
maxWaitMillis=-1
基本配置 说明
driverClassName=com.mysql.cj.jdbc.Driver 要使用的JDBC驱动程序的完全限定的Java类名称
url=xxx 连接的路径,通过驱动创建所需的连接。
connectionProperties JDBC驱动建立连接时附带的连接属性,属性格式[属性名=property;]
username=root 连接的用户名,通过驱动创建需的连接。
password=root 连接的密码,通过驱动创建所需的连接。
连接池 说明
initialSize=0 初始化连接数量,连接池启动时创建的。
maxTotal=8 最大活动连接数量,连接池在同一时间能够分配的最大活动连接的数量, 负数表示不限制。
maxIdle=8 最大空闲连接,连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,负数表示不限制。
minIdle=0 最小空闲连接,连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,0表示不创建。
maxWaitMillis=-1 最大等待毫秒时间,当没有可用连接时,连接池等待连接被归还的最大时间,超过则抛出异常,小于等于0表示无限等待。

工具类

$ vim util/DBCPUtil.java
package com.jc.util;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

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

public class DBCPUtil {
    private static DataSource ds = null;
    static {
        //导入配置文件
        Properties p = new Properties();
        InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
        try {
            p.load(is);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        //获取数据源
        try {
            ds = BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
    private static DataSource getDataSource(){
        return ds;
    }
    //获取连接
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    //释放连接返还连接池
    public static void release(Connection conn, Statement stmt, ResultSet rs){
        if(rs != null){
            try{
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(stmt != null){
            try{
                stmt.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if(conn != null){
            try{
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

测试

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    conn = DBCPUtil.getConnection();
    System.out.println(conn);

    String sql = "SELECT * FROM sys_user WHERE 1=1 AND id = ?";
    ps = conn.prepareStatement(sql);
    System.out.println(ps);
    ps.setString(1, "4");

    rs = ps.executeQuery();
    System.out.println(rs);
    while(rs.next()){
        System.out.println(rs.getString("id"));
    }
} catch (SQLException e) {
    e.printStackTrace();
}finally {
    DBCPUtil.release(conn, ps, rs);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容