数据库连接池HikariCP、Druid

一、参考

  1. 实战:搞懂数据库连接池和Druid连接池
  2. 数据库连接池
  3. mySQL数据库druid连接池配置

二、为什么要有数据库连接池

传统数据库连接的问题?

在这里插入图片描述

  1. 频繁创建和关闭连接:
  • 每次执行 SQL 都需要创建连接,操作完成后关闭连接。
  • 创建和关闭连接是非常耗时的操作(涉及网络通信、身份验证等)。
  1. 资源浪费:
  • 连接对象占用系统资源(如内存、CPU)。
  • 频繁创建和关闭连接会导致资源浪费。
  1. 性能瓶颈:
  • 高并发场景下,频繁创建连接会导致数据库性能下降。
  1. 连接数限制:
  • 数据库对同时打开的连接数有限制,频繁创建连接可能导致连接数耗尽

连接池的优势

  • 复用连接: 连接池预先创建一定数量的连接,应用程序从池中获取连接,使用完毕后归还连接。
  • 减少开销: 避免了频繁创建和关闭连接的开销,提高了性能。
  • 资源控制: 可以限制最大连接数,防止数据库连接数过多导致资源耗尽。
  • 提高响应速度: 连接池中的连接是预先创建的,应用程序可以快速获取连接。

连接池的工作原理

在这里插入图片描述

核心组件:

  • 连接池管理器: 负责创建、管理和销毁连接池。

  • 连接池: 维护一组数据库连接,提供连接的获取和归还功能。

  • 空闲连接: 当前未被使用的连接,存放在连接池中。

  • 活动连接: 当前正在被使用的连接。

工作流程:

  1. 初始化连接池: 在应用程序启动时,连接池会预先创建一定数量的数据库连接。
  2. 获取连接:
    • 应用程序从连接池中请求一个连接。
    • 如果池中有空闲连接,则直接返回;如果没有空闲连接且未达到最大连接数,则创建新连接;如果已达到最大连接数,则等待或抛出异常。
  3. 使用连接: 应用程序使用连接执行数据库操作。
  4. 归还连接: 操作完成后,应用程序将连接归还给连接池,而不是关闭连接。
  5. 连接回收: 连接池会定期检查连接的有效性,回收无效连接并创建新连接。

三、常用连接池对比

常见的连接池有C3P0、Druid、HikariCP 、DBCP

  1. JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方来实现。

  2. C3P0数据库连接池,速度相对较慢(只是慢一丢丢),但是稳定性很好,Hibernate,Spring底层用的就是C3P0

  3. DBCP数据库连接池,速度比C3P0快,但是稳定性差。

  4. Proxool数据库连接池,有监控连接池状态的功能,但稳定性仍然比C3P0差一些。

  5. BoneCP数据库连接池,速度较快。

  6. Druid数据库连接池(德鲁伊连接池),由阿里提供,集DBCP,Proxool,C3P0连接池的优点于一身,是日常项目开发中使用频率最高的数据库连接池。

  7. HikariCP:HikariCP是一个轻量级、高效的JDBC连接池,具有快速启动和低延迟的特点。 HikariCP的设计目标是提供极佳的性能和可靠性,同时尽量减少资源消耗和开销。HikariCP支持各种JDBC驱动程序和数据源。相比于其他连接池,HikariCP配置简单,易于使用。

特性HikariCPApache Commons DBCPTomcat JDBC PoolH2 Database Connection Poolc3p0Druid
性能非常高一般一般一般一般非常高
配置简单性中等中等中等中等
可定制性中等中等
监控和统计功能
防火墙功能
社区活跃度中等中等中等
适用场景各种场景一般场景Tomcat 环境嵌入式数据库场景各种场景大型互联网企业环境
是否支持连接池复用
支持的数据库所有主流数据库所有主流数据库所有主流数据库H2 Database所有主流数据库所有主流数据库

目前主流使用 Druid 和 HikariCP 数据库连接池

  • HikariCP,号称性能最好的数据库连接池。Spring Boot 2.X 版本,默认采用 HikariCP 。

  • Druid,为监控而生的数据库连接池。阿里大规模采用 Druid 。

HikariCP 连接池

  • HikariCP 是一个高性能的 JDBC 连接池实现,以其轻量、快速和简单著称。它的设计目标是尽可能减少开销,提供最快的数据库连接获取速度。

  • 特点

    • 轻量:代码量少,依赖少。
    • 高性能:在大多数场景下性能优于其他连接池。
    • 简单易用:配置简单,开箱即用。
    • 可靠性高:经过严格测试,稳定性强。
    • HikariCP 通过优化代码和减少锁竞争,显著提高了连接获取的速度
    • 减少了不必要的对象创建和垃圾回收,降低了 JVM 的开销
    • 自动维护连接池的健康状态,回收无效连接

HikariCP 单数据源

  1. 引入依赖
<dependencies>
    <!--此依赖默认使用Hikari连接池,实现对数据库连接池的自动化配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <!-- 默认版本是 8.0.22-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>
  1. 在application.yml中,添加 HikariCP 配置
server:
  port: 8010
spring:
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:33306/atguigudb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      # 连接池中允许的最小连接数。缺省值:10
      minimum-idle: 10
      # 连接池中允许的最大连接数。缺省值:10
      maximum-pool-size: 100
      # 自动提交
      auto-commit: true
      # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
      idle-timeout: 600
      # 连接池名字
      pool-name: 泡泡的HikariCP
      # 一 个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
      max-lifetime: 1800000
      # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
      connection-timeout: 30000
  1. 定义控制器,调用数据库
package com.hb.controller;


import com.hb.pojo.Student;
import com.hb.service.StudentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

@RestController
@Api(tags = {"Student模块"}, value = "数据字典控制器")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @Autowired
    DataSource dataSource;

    @ApiOperation("mybatis 测试")
    @GetMapping("/getUser/{id}")
    public Student GetUser(@PathVariable int id) {
        System.out.println(dataSource);
        Student student = studentService.sell(id);
        return student;
    }
}

在这里插入图片描述

HikariCP 多数据源

后续补充

Druid 连接池

  • Druid 是阿里巴巴开源的数据库连接池实现**,除了高性能外,还提供了丰富的监控和统计功能,适合需要深度监控和管理的场景**

  • 特点

    • 高性能:性能接近 HikariCP。
    • 功能丰富:支持 SQL 监控、防火墙、加密等功能。
    • 监控强大:内置监控页面,支持实时查看连接池状态和 SQL 执行情况
    • 扩展性强:支持自定义过滤器
  • 核心优势

    • SQL 监控:可以监控 SQL 的执行时间、执行次数等,帮助优化 SQL 性能。
    • 防火墙功能:提供 SQL 防火墙,防止恶意 SQL 注入。
    • 加密支持:支持数据库密码加密,提高安全性。
    • 扩展性:支持自定义过滤器,方便扩展功能

druid 使用案例

  1. 引入依赖
<dependencies>
    <!-- 如果使用druid-spring-boot-starter, 那么需要在启动类上使用@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) -->
    <!--引入druid数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.16</version>
    </dependency>
    <!-- 默认版本是 8.0.22-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>
  1. 在application.yml中,添加 druid 配置
    一定要指明 spring.datasource.type = com.alibaba.druid.pool.DruidDataSource , 表明现在使用的事 druid 连接池
server:
  port: 8010
spring:
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:33306/atguigudb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    # druid-spring-boot-starter 依赖自动生效 druid,可以不配置 type 属性,但建议配置
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
      min-idle: 10 # 最小连接池数量
      maxActive: 200 # 最大连接池数量
      maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置
      timeBetweenEvictionRunsMillis: 60000 # 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。
      minEvictableIdleTimeMillis: 300000 # 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间
      #      WebStatFilter:用于收集 Web 应用程序的 SQL 慢查询日志。
      web-stat-filter:
        enabled: true
      # StatViewServlet:提供了一个可视化的监控页面,可以查看连接池的各项指标。
      stat-view-servlet: # http://localhost:8010/druid/index.html 访问监控界面
        enabled: true
        url-pattern: /druid/*
        login-username: druid
        login-password: druid
      #        allow: 127.0.0.1可根据需要配置IP白名单
      #        deny: 可根据需要配置IP黑名单
      validationQuery: SELECT 1 FROM DUAL # 验证数据库服务可用性的sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL
      testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun
      testOnBorrow: false # 申请连接时直接检测连接是否有效.申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      testOnReturn: false # 归还连接时检测连接是否有效.归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
      poolPreparedStatements: true # 开启PSCache
      maxPoolPreparedStatementPerConnectionSize: 20 #设置PSCache值
      connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接三次
      breakAfterAcquireFailure: true # 数据库服务宕机自动重连机制
      timeBetweenConnectErrorMillis: 300000 # 连接出错后重试时间间隔
      asyncInit: true # 异步初始化策略
      remove-abandoned: true # 是否自动回收超时连接
      remove-abandoned-timeout: 1800 # 超时时间(以秒数为单位)
      transaction-query-timeout: 6000 # 事务超时时间
      filters: stat,wall,log4j2
      useGlobalDataSourceStat: true #合并多个DruidDataSource的监控数据
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #通过connectProperties
  1. 定义控制器,调用数据库
package com.hb.controller;


import com.hb.pojo.Student;
import com.hb.service.StudentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

@RestController
@Api(tags = {"Student模块"}, value = "数据字典控制器")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @Autowired
    DataSource dataSource;

    @ApiOperation("mybatis 测试")
    @GetMapping("/getUser/{id}")
    public Student GetUser(@PathVariable int id) {
        System.out.println(dataSource);
        Student student = studentService.sell(id);
        return student;
    }
}

在这里插入图片描述

durid 监控界面

  1. springboot 添加开启监控页面的配置
server:
  port: 8010
spring:
  #配置数据源
  datasource:
    url: jdbc:mysql://localhost:33306/atguigudb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    # druid-spring-boot-starter 依赖自动生效 druid,可以不配置 type 属性,但建议配置
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      #      WebStatFilter:用于收集 Web 应用程序的 SQL 慢查询日志。
      web-stat-filter:
        enabled: true
      # StatViewServlet:提供了一个可视化的监控页面,可以查看连接池的各项指标。
      stat-view-servlet: # http://localhost:8010/druid/index.html 访问监控界面
        enabled: true
        url-pattern: /druid/*
        login-username: druid
        login-password: druid
      #        allow: 127.0.0.1可根据需要配置IP白名单
      #        deny: 可根据需要配置IP黑名单
  1. 浏览器输入 http://localhost:8010/druid/

在这里插入图片描述

### 回答1: PSPICE 17.2 是一种用于电子电路仿真和分析的软件工具。下面是一份简单的 PSpice 17.2 使用初级教程: 1. 安装和启动:首先,你需要下载并安装 PSpice 17.2 软件。安装完成后,双击图标启动软件。 2. 创建电路:在软件界面上,选择“文件”>“新建”,然后在电路编辑器中创建你的电路。你可以从元件库中选择组件,并将其拖放到画布上。连接元件的引脚以构建电路。 3. 设置元件参数:双击元件以打开元件参数设置对话框。在对话框中,设置元件的值、名称和其他参数。对于电阻、电容等基本元件,可以直接输入数值。 4. 设置仿真配置:选择“仿真”>“设置和校验”,然后在仿真设置对话框中选择仿真的类型和参数。你可以选择直流分析、交流分析、暂态分析等。设置仿真参数后,点击“确定”。 5. 运行仿真:选择“仿真”>“运行”来启动仿真。在仿真过程中,软件将模拟电路的响应,并将结果输出到仿真波形窗口中。 6. 查看仿真结果:在仿真波形窗口中,你可以查看各个元件的电流、电压等参数随时间变化的波形。你还可以对波形进行放大、缩小、平移等操作,以更详细地分析电路的性能。 7. 保存和导出结果:在仿真过程中,你可以选择将结果保存为文件或导出为其他格式,如图像文件或数据文件。 以上是 PSpice 17.2 使用初级教程的基本步骤。随着实践的深入,你可以进一步了解复杂电路的建模和分析方法,并尝试更高级的功能和技术。 ### 回答2: PSPICE 17.2是一款电子电路仿真软件,用于对电路进行分析和验证。以下是PSPICE 17.2的使用初级教程: 1. 下载和安装:在官方网站上下载PSPICE 17.2并进行安装。 2. 组件库:打开PSPICE软件后,点击“Capture CIS”图标,进入组件库界面。选择适当的电子元件,如电阻、电容、二极管等,将它们拖放到画布上。 3. 电路连接:在画布上拖放所需元件后,使用导线工具连接它们。点击导线图标,选择合适的连接方式,并将其拖动到适当的端口上。 4. 参数设定:双击元件,弹出元件属性对话框。在这里设置元件的数值,例如电阻的阻值、电容的电容值等。 5. 电源设置:在画布上点击右键,选择“Power Sources”,然后选择适当的电源,如直流电源或交流电源。设置电源的电压或电流数值。 6. 仿真设置:点击画布上方的“PSpice”选项,选择“Edit Simulation Profile”打开仿真配置对话框。在仿真配置中,设置仿真参数,如仿真类型(直流、交流、脉冲等)、仿真时间等。 7. 仿真运行:在仿真配置对话框中点击“Run”按钮,开始进行电路仿真运行。仿真完成后,可以查看并分析仿真结果,如电流、电压、功率等。 8. 结果分析:通过菜单栏中的“PSpice>Probe”选项,打开特定信号的仿真结果。通过选择信号节点,可以显示该信号的波形、幅值和频谱等信息。 9. 数据输出:仿真结束后,可以通过“PSpice>Results”菜单栏选项,导出仿真结果到文本文件,以供后续分析。 10. 误差调整:如果仿真结果与预期不符,可以检查电路连接、元件参数等以找出问题。根据需要进行调整,重新运行仿真以验证改进效果。 以上就是PSPICE 17.2使用初级教程的简要介绍。在使用过程中,请参考软件的帮助文件和官方文档,以获取更详细的指导和解决方法。任何新的软件都需要不断的实践和尝试,希望这个教程能对你有所帮助。 ### 回答3: PSPICE 17.2是一款常用的电路仿真软件,用于电路设计和分析。下面是一个简要的PSPICE 17.2的初级教程: 1. 下载和安装:首先,从官方网站下载PSPICE 17.2,并按照安装向导进行安装。安装完成后,打开软件。 2. 创建新工程:在PSPICE 主界面上,点击“File”菜单,然后选择“New Project”来创建一个新的工程。给工程起一个适当的名字,并选择工程的存储位置。 3. 添加电路元件:在工程界面上,点击“Place”图标,然后选择不同的元件来构建你的电路。你可以从库中选择各种电子元件,如电阻、电容、电感等,并将它们拖放到工程界面上。 4. 连接元件:选择“Wire”图标,然后点击元件的引脚来连接它们。确保连接顺序正确,以保证电路的正确性。 5. 设置元件参数:对于每个添加的元件,你需要设置它们的参数。右键点击元件,选择“Edit Propertiess”,然后在弹出的窗口中输入适当的参数值。 6. 添加电源:在电路中添加电源,以提供电路所需的电能。选择“Place”图标,然后选择合适的电源元件并将其拖放到电路中。同样,设置电源的参数值。 7. 设置仿真配置:在工程界面上,点击“PSpice”菜单,然后选择“Edit Simulation Profile”来设置仿真配置参数。你可以选择仿真类型、仿真时间和仿真步长等。 8. 运行仿真:点击“PSpice”菜单,选择“Run”来运行仿真。PSPICE将自动运行仿真并显示结果。 9. 分析和优化:根据仿真结果,可以分析和优化电路的性能。你可以观察电流、电压和功率等参数,以评估电路的性能,并根据需要进行调整。 10. 保存和导出结果:在分析和优化完成后,可以保存你的工程并导出结果。点击“File”菜单,选择“Save Project”来保存工程,然后选择“Outut”菜单,选择“Export”来导出结果。 以上是PSPICE 17.2的初级教程的简要介绍。通过以上步骤,你可以开始使用PSPICE 17.2进行电路设计和仿真。在实践中不断探索和学习,你将成为一个熟练的PSPICE用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值