HikariCP 的使用

minimum-idle 池中最小空闲连接数量。一般测试开发5上线10

作者默认不设置最小连接数,使最小值保持与最大值一样 对于数据源来讲本身就是一个高效的,目前互联网大环境来说,用户类很多,随之而来的请求也是十分多的,所以对于一个网站来讲负载情况是稳定的不会有过多的波动,不太会有连接浪费的情况。

maximum-pool-size 池中最大连接数(包括空闲和正在使用的连接) 默认值10,一般4核10、8核20
pool-name 连接池的名字
auto-commit 是否自动提交池中返回的连接。默认值为true。
idle-timeout 空闲时间。仅在minimum-idle小于maximum-poop-size的时候才会起作用。默认值10分钟。
max-lifetime 连接池中连接的最大生命周期。当连接一致处于闲置状态时,数据库可能会主动断开连接。
connection-timeout 连接超时时间。默认值为30s,可以接收的最小超时时间为250ms。但是连接池请求也可以自定义超时时间

  1. ############################################################
  2. #
  3. # yml格式配置数据源信息
  4. #
  5. ############################################################
  6. spring:
  7. datasource: # 数据源的相关配置
  8. type: com.zaxxer.hikari.HikariDataSource # 🔥🔥🔥数据源类型:HikariCP🔥🔥🔥
  9. driver-class-name: com.mysql.jdbc.Driver # mysql驱动
  10. url: jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect
  11. username: root
  12. password: root
  13. hikari:
  14. connection-timeout: 30000 # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQ
  15. minimum-idle: 5 # 最小连接数
  16. maximum-pool-size: 20 # 最大连接数
  17. auto-commit: true # 自动提交
  18. idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
  19. pool-name: DateSourceHikariCP # 连接池名字
  20. max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟
  21. connection-test-query: SELECT 1 # 用于测试连接是否可用的查询语句
  1. # 需要添加该数据源的依赖包,因为springboot不默认提供
  2. spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
  3. #
  4. # 配置数据源相关 使用 HikariCP 数据源
  5. #
  6. ############################################################
  7. # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException 默认:30
  8. spring.datasource.hikari.connection-timeout=30000
  9. # 最小连接数
  10. spring.datasource.hikari.minimum-idle=5
  11. # 最大连接数
  12. spring.datasource.hikari.maximum-pool-size=15
  13. # 自动提交
  14. spring.datasource.hikari.auto-commit=true
  15. # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),默认:10分钟
  16. spring.datasource.hikari.idle-timeout=600000
  17. # 连接池名字
  18. spring.datasource.hikari.pool-name=DatebookHikariCP
  19. # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms,建议设置比数据库超时时长少60秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
  20. spring.datasource.hikari.max-lifetime=28740000
  21. spring.datasource.hikari.connection-test-query=SELECT 1

前提:

什么是数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

什么是数据源

JDBC2.0 提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序总访问数据库时不必编写连接数据可的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据库Connection队象。

数据源与数据连接池

数据源建立多个数据库连接池,这些数据库连接会保存在数据库连接池中,当需要访问数据库时,只需要你从数据库连接池中获取空闲的数据库的连接,当程序员访问数据库结束时,数据连接会放回数据库连接池中。

数据库连接池的优势

传统的JDBC访问数据库技术,每次访问数据库都需要通过数据库驱动器Driver和数据库名称以及密码等等资源建立数据库连接。这样的连接存在俩大问题:
1、频繁的建立数据库连接与断开数据库,这样会小河大量的子资源和时间,降低性能。
2、数据库的连接需要用户名和密码等等。这些需要一定的内存和cpu一定开销。

HikariCP

光(ひかり)源自日语,顾名思义,说明连接池特别快,已经是号称最快的数据源了。
这个产品的口号是“快速、简单、可靠”。
传说中BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右🚀。
HikariCP很多优化都是针对BoneCP。
BoneCP的作者对于这个项目貌似已经心灰意冷,明确说推荐使用HikariCP了😂
在SpringBoot2.X版本默认使用HikariCP数据源连接池

优点:

  • 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;
  • 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
  • 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
  • 自定义集合类型(ConcurrentBag):提高并发读写的效率;
  • 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)。

可靠性方面:
HikariCP:等待5秒钟后,如果连接还是没有恢复,则抛出一个SQLExceptions 异常;后续的getConnection()也是一样处理;
C3P0:完全没有反应,没有提示,也不会在“CheckoutTimeout”配置的时长超时后有任何通知给调用者;然后等待2分钟后终于醒来了,返回一个error;
Tomcat:返回一个connection,然后……调用者如果利用这个无效的connection执行SQL语句……结果可想而知;大约55秒之后终于醒来了,这时候的getConnection()终于可以返回一个error,但没有等待参数配置的5秒钟,而是立即返回error;
BoneCP:跟Tomcat的处理方法一样;也是大约55秒之后才醒来,有了正常的反应,并且终于会等待5秒钟之后返回error了;

可见,HikariCP的处理方式是最合理的。