JDBC强化关键_009_连接池

目 录

一、概述

1.未使用连接池带来的问题

2.连接池解决的问题

3.所有连接池都实现的接口

4.连接池的常见属性

二、常用连接池

[三、Bruid 连接池](#三、Bruid 连接池)

[1.引入 druid 的 jar 包](#1.引入 druid 的 jar 包)

2.配置文件

3.从连接池获取连接对象

[4.利用 Bruid 连接池改造工具类](#4.利用 Bruid 连接池改造工具类)

[四、HikariCP 连接池](#四、HikariCP 连接池)

[1.引入 HikariCP 的 jar 包](#1.引入 HikariCP 的 jar 包)

2.配置文件

3.从连接池获取连接对象


一、概述

1.未使用连接池带来的问题

  1. Connection 是重量级对象,创建 Connection 对象就是建立两个进程间的通信,非常耗费资源。一次完整的数据库操作,大部分时间耗费在连接对象的创建;
  2. 每一次请求都创建一个 Connection 对象,效率较低;
  3. 连接对象的数量无法限制,若数量过高,会导致数据库服务器崩溃。

2.连接池解决的问题

  1. 事先创建好多个连接对象,放入集合中;
  2. 用户请求时,需要连接对象直接从连接池中获取,无需创建连接对象,效率较高;
  3. 连接对象只能从连接池中获取,若没有空闲的连接对象就只能等待,如此便控制了创建连接对象的数量。

3.所有连接池都实现的接口

  1. 连接池有很多种,但它们都实现了 javax.sql.DataSource 接口;
  2. 可以自定义连接池,只需实现 DataSource 接口。

4.连接池的常见属性

  1. 初始化连接数(initialSize):连接池初始化时创建的连接数;
  2. 最大连接数(maxActive):连接池中的最大连接数。当连接池中的连接数量达到此值时,后续请求会被阻塞并等待连接池中有连接被释放后再处理;
  3. 最小空闲连接数(minIdle):连接池中最小空闲连接数。即当下没有请求,但连接池中至少也要保持一定数量的空闲连接,以便应对高并发请求或突发连接请求;
  4. 最大空闲连接数(maxIdle):连接池中最大空闲连接数。即连接池中空闲连接数量达到设定值后,多余的空闲连接将会被连接池释放掉;
  5. 最大等待时间(maxWait):连接池中连接数量达到最大值时,后续请求需要等待的最大时间。若超出该时间,就会抛出异常;
  6. 连接有效性检查:为确保连接池中只有可用连接,一些连接池会定期对连接进行有效性检查。testOnBorrow、testOnReturn 属性就是配置检查的选项;、
  7. driver、url、user、password 等。

二、常用连接池

  1. DBCP:2001年诞生,最早的连接池。是 Apache Software Foundation 的一个开源项目。设计初衷是为了满足 Tomcat 服务器对连接池管理的需求;

  2. c3p0:由 Steve Waldman 于 2004 年推出的,是一个高性能、高可靠性、易配置的数据库连接池。能够提供连接池的容错能力、自动重连等功能,适用于高并发场景和数据量大的应用;

  3. Druid:阿里巴巴集团开发,2011 年底开始对外公开,2012 年正式发布。Druid 是一个具有高性能、高可靠性、丰富功能的数据库连接池,不仅可以做连接池,还能做监控、分析和管理数据库,支持SQL防火墙、统计分析、缓存和访问控制等功能;

  4. HikariCP:Brett Wooldridge 于2012年创建的开源项目,被认为是 Java 语言下最快的连接池之一,具有快速启动、低延迟、低资源消耗等优点。HikariCP 连接池适用于高并发场景和云端应用。性能是极致的,相对于 Druid 来说,它更加轻量级。Druid 连接池在连接管理之外提供了更多的功能,例如 SQL 防火墙、统计分析、缓存、访问控制等,适用于在数据库访问过程中,需要进行细粒度控制的场景。HikariCP 则更侧重于性能方面的优化,对各种数据库的兼容性也更好;

  5. BoneCP:一款 Java 语言下的高性能连接池,于 2015 年由 Dominik Gruntz 在 GitHub 上发布。BoneCP 具有分布式事务、连接空闲检查、SQL 语句跟踪和性能分析、特定类型的连接池等特点。BoneCP 连接池适用于大型应用系统和高并发的负载场景。


三、Bruid 连接池

1.引入 druid 的 jar 包


2.配置文件

bash 复制代码
# 根路径下创建 jdbc.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=root
initialSize=5
minIdle=10
maxActive=20

3.从连接池获取连接对象

java 复制代码
public class DruidTest {
    public static void main(String[] args) throws Exception {
        // 获取一个输入流,指向一个属性资源文件
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties");

        // 创建属性类对象
        Properties properties = new Properties();

        // 将属性资源文件加载到属性类对象中
        properties.load(in);

        // 获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        // 通过连接池获取连接对象
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

        // CRUD 操作

        // 关闭资源,不是真正关闭,只是将连接池中的连接对象状态修改为空闲
        connection.close();
    }
}

4.利用 Bruid 连接池改造工具类

java 复制代码
public class DbUtils2 {
    // 工具类的构造方法都是私有的,不能被实例化。
    private DbUtils2() {
    }

    private static DataSource dataSource;

    static {
        try {
            // 获取一个输入流,指向一个属性资源文件
            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties");

            // 创建属性类对象
            Properties properties = new Properties();

            // 将属性资源文件加载到属性类对象中
            properties.load(in);

            // 获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
java 复制代码
public class ConnectionTest {
    public static void main(String[] args) throws SQLException {
        Connection c1 = DbUtils2.getConnection();
        Connection c2 = DbUtils2.getConnection();
        Connection c3 = DbUtils2.getConnection();
        Connection c4 = DbUtils2.getConnection();
        Connection c5 = DbUtils2.getConnection();

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
    }
}

四、HikariCP 连接池

1.引入 HikariCP、slf4j-api jar 包


2.配置文件

bash 复制代码
# 根路径下创建 jdbc2.properties
driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/jdbc
username=root
password=root
minimumIdle=5
maximumPoolSize=20

3.从连接池获取连接对象

java 复制代码
public class HikariCPTest {
    public static void main(String[] args) throws Exception {
        // 获取一个输入流,指向属性资源文件
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc2.properties");

        // 创建属性类对象
        Properties properties = new Properties();

        // 将属性资源文件加载到属性类对象中
        properties.load(in);

        // 创建配置信息对象
        HikariConfig config = new HikariConfig(properties);

        // 获取连接池对象
        DataSource dataSource = new HikariDataSource(config);

        // 通过连接池获取连接对象
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

        // CRUD 操作

        // 释放连接对象
        connection.close();
    }
}
相关推荐
老纪的技术唠嗑局12 分钟前
单机分布式一体化数据库的架构设计与优化
数据库·分布式
GBASE18 分钟前
“G”术时刻:Linux环境下通过ESQL/C方式连接南大通用GBase 8s数据库(上)
数据库
一只fish19 分钟前
MySQL 8.0 OCP 1Z0-908 题目解析(23)
数据库·mysql
Shimiy20 分钟前
第四章 数组
java
间彧20 分钟前
什么是JVM Young GC
java·jvm
不拘小节曹阿蛮20 分钟前
Ubuntu 20.04 ARM64架构下面安装mysql5.7.22
数据库
xiaok21 分钟前
@Param注解的作用
java·后端
脑袋大大的23 分钟前
钉钉企业应用开发技巧:查询表单实例数据新版SDK指南
java·钉钉·企业应用开发
Seven9736 分钟前
G1收集器:JVM垃圾回收的新一代王者
java