Connection Pool 的实现(JavaEE 8 + MySQL)

  1. 连接池技术的简介
    常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等,本文介绍以及实现的数据库连接池技术为 DBCP。
    DBCP (Database Connection Pool) : 由Apache开发的一个Java数据库连接池项目,Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。
  2. 连接池技术的原理
    连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。
    连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
  3. 连接池的实现
    实现环境: jdk 13.0.2 + JavaEE 8 + MySQL 5.7
    单独使用dbcp需要3个包:commons-dbcp.jar, commons-pool.jar, commons-collections.jar
    下载链接:commons-dbcp-1.4.jar, commons-pool-1.6.jar, commons-collections4-4.4.jar
    jar包、配置文件、DBCP实现类目录结构如下图所示
    在这里插入图片描述
    Project Structure -> libraries 导入jar包如下图所示
    在这里插入图片描述
    配置文件实现
# 数据库地址
dbUrl=jdbc:mysql://127.0.0.1:3306/school?useSSL=FALSE&serverTimezone=UTC&characterEncoding=utf8
# 数据库用户名
userName=root
# 数据库密码
password=990818
# 数据库驱动
driverName=com.mysql.jdbc.Driver
# 初始化连接数
initSize=2
# 可同时连接的最大连接数
maxActive=1
# 最大等待时间
maxWait=3000
# 最大空闲连接数
maxIdle=2
# 最小空闲连接数
minIdle=0

DBCP实现

package com.javaEE.code.class12;

import org.apache.commons.dbcp.BasicDataSource;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

// Database Connection Pool
public class DBCP {

    // 数据库连接池
    private static BasicDataSource dbcp;

    //为不同线程管理连接
    private static ThreadLocal<Connection> tl;

    //通过配置文件来获取数据库参数
    static {
        try {
            Properties properties = new Properties();

            InputStream inputStream = DBCP.class.getClassLoader().getResourceAsStream("com/javaEE/code/class12/Application.properties");

            properties.load(inputStream);
            inputStream.close();

            // 初始化连接池
            dbcp = new BasicDataSource();

            // 数据库驱动 (Class.forName())
            dbcp.setDriverClassName(properties.getProperty("driverName"));
            // 数据库url
            dbcp.setUrl(properties.getProperty("dbUrl"));
            // 数据库用户名
            dbcp.setUsername(properties.getProperty("userName"));
            // 数据库密码
            dbcp.setPassword(properties.getProperty("password"));
            // 初始化连接数量
            dbcp.setInitialSize(Integer.parseInt(properties.getProperty("initSize")));
            // 连接池允许的最大连接数
            dbcp.setMaxActive(Integer.parseInt(properties.getProperty("maxActive")));
            // 最大等待时间
            dbcp.setMaxWait(Integer.parseInt(properties.getProperty("maxWait")));
            // 最小空闲数
            dbcp.setMinIdle(Integer.parseInt(properties.getProperty("minIdle")));
            // 最大空闲数
            dbcp.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
            // 初始化线程本地
            tl = new ThreadLocal<Connection>();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 通过连接池获取一个连接
    public static Connection getConnection() throws SQLException {
        Connection conn = dbcp.getConnection();
        tl.set(conn);
        return conn;
    }

    // 归还连接,未关闭
    public static void closeConnection() {
        try {
            Connection conn = tl.get();
            if (conn != null) {
                conn.close();
                tl.remove();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

建立数据库连接时

// 获取连接
Connection connetion = DBCP.getConnection();

归还数据库连接时

// 归还数据库连接
DBCP.closeConnection();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值