写点什么

SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0 等等)

作者:
  • 2022 年 8 月 24 日
    河南
  • 本文字数:1989 字

    阅读完需:约 7 分钟

SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)

1、连接池介绍

   在 jdbc 的基础上,我们发现来回的获得数据库连接返回数据库连接给数据库会大大降低数据库的执行效率。所以我们可以采用使用连接池的方式来放置连接、获取连接。当我们需要数据库连接的时候,我们不在向数据库获取,而是从连接池中获得数据库的连接,用完连接之后也不再返回给数据库,而是直接返回给连接池。这样数据库的效率的到很大的提升。


常用的数据库连接池有两种:DCBP、C3P0、HikariCP 和 Druid 等。

2、HicariCP

   Hikari 是一款非常强大,高效,并且号称“史上最快连接池”。由于其性能方面比较好,并且在 springboot2.0 之后,采用的默认数据库连接池就是 HikariCP,在引用 parents 后不用专门再添加依赖。

1)导入坐标

<!--  默认的数据源(HicariCP) --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency>
复制代码

2)修改配置

spring:  datasource:    type: com.zaxxer.hikari.HikariDataSource      #数据源的类型    driver-class-name: com.mysql.cj.jdbc.Driver       #数据源的驱动类型    url: jdbc:mysql://localhost:3306/imooc    useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai #数据源的连接地址    username: root                                    #数据源的用户名    password: root                                   #数据源的密码
复制代码


一些常用的配置选项


    hikari:                                           #数据源的配置信息      connection-timeout: 30000       # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒      minimum-idle: 5                 # 最小连接数      maximum-pool-size: 20           # 最大连接数      auto-commit: true               # 自动提交      idle-timeout: 600000            # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟      pool-name: DateSourceHikariCP   # 连接池名字      max-lifetime: 1800000           # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms      connection-test-query: SELECT 1
复制代码

3)优势

  • 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU 缓存可以加载更多的程序代码;

  • 优化代理和拦截器:减少代码,例如 HikariCP 的 Statement proxy 只有 100 行代码,只有 BoneCP 的十分之一;

  • 自定义数组类型(FastStatementList)代替 ArrayList:避免每次 get()调用都要进行 range check,避免调用 remove()时的从头到尾的扫描;

  • 自定义集合类型(ConcurrentBag):提高并发读写的效率;

  • 其他针对 BoneCP 缺陷的优化,比如对于耗时超过一个 CPU 时间片的方法调用的研究(但没说具体怎么优化)。

3、Druid

官网:https://druid.apache.org/



1)导入坐标

导入对应的坐标(starter)


<dependencies>    <dependency>        <groupId>com.alibaba</groupId>        <artifactId>druid-spring-boot-starter</artifactId>        <version>1.2.6</version>    </dependency></dependencies>
复制代码

2)修改配置

修改配置,在数据源配置中有一个 type 属性,专用于指定数据源类型


spring:  datasource:    druid:      driver-class-name: com.mysql.cj.jdbc.Driver      url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC      username: root      password: root
复制代码


注意观察,配置项中,在 datasource 下面并不是直接配置 url 这些属性的,而是先配置了一个 druid 节点,然后再配置的 url 这些东西,通过提示功能可以打开 druid 相关的配置查阅。


3)优势

Druid 相对于其他数据库连接池的优点:


  • 强大的监控特性,通过 Druid 提供的监控功能,可以清楚知道连接池和 SQL 的工作情况

  • 监控 SQL 的执行时间、ResultSet 持有时间、返回行数、更新行数、错误次数、错误堆栈信息。

  • SQL 执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个 SQL 执行了 1000 次,其中 0~1 毫秒区间 50 次,1~10 毫秒 800 次,10~100 毫秒 100 次,100~1000 毫秒 30 次,1~10 秒 15 次,10 秒以上 5 次。通过耗时区间分布,能够非常清楚知道 SQL 的执行耗时情况。

  • 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache 命中率等

  • 方便扩展,Druid 提供了 Filter-Chain 模式的扩展 API,可以自己编写 Filter 拦截 JDBC 中的任何方法,可以在上面做任何事情,比如说性能监控、SQL 审计、用户名密码加密、日志等等。

  • Druid 集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

总结

  1. 整合连接池需要导入连接池对应的 starter

  2. 根据连接池提供的配置方式进行配置

  3. 整合第三方技术通用方式

  4. 导入对应的 starter

  5. 根据提供的配置格式,配置非默认值对应的配置项

发布于: 刚刚阅读数: 4
用户头像

关注

在校大三学生一枚 2022.08.02 加入

喜欢学习编程,擅长技术栈JAVA

评论

发布
暂无评论
SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)_SpringBoot 2_斯_InfoQ写作社区