DBCP

作者: JunChow520 | 来源:发表于2022-10-06 13:06 被阅读0次
    分类 说明
    名称 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);
    }
    

    相关文章

      网友评论

          本文标题:DBCP

          本文链接:https://www.haomeiwen.com/subject/jykuartx.html