当前位置: 首页 > 工具软件 > DBCP > 使用案例 >

DBCP

丌官霖
2023-12-01
分类说明
名称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。

DBCPJDBCJava
DBCP2JDBC4.1Java7
DBCP1.4JDBC4Java6
DBCP1.3JDBC3Java1.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连接的路径,通过驱动创建所需的连接。
connectionPropertiesJDBC驱动建立连接时附带的连接属性,属性格式[属性名=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);
}
 类似资料: