Spring Boot 2.+的默认连接池HikariCP详解

一、Spring Boot 2.+默认连接池HikariCP

如果是Spring Boot2.+,那么默认的连接池就是Hikaricp,不需要再另外导入包和配置,怎么证明?启动项目,可以看到控制台

启动信息HikariPool

启动信息HikariDataSource

我们在控制台看到了

HikariPool-1 - Starting...
HikariPool-1 - Start completed

Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]

说明Spring Boot 2.+默认使用的就是连接池HikariCP

二、调整连接池参数

HikariCP连接池提供了默认值,如果有需要也可以在配置文件里进行调整参数

spring:
  ########-spring datasource-########
  datasource:
     #账号配置
     url: jdbc:mysql://127.0.0.1:3306/retail_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: ENC(5raHicqGiQ1nEXKO+R9ykYwJUrD/+nbx)
     password: ENC(1NiRLG1lUkzLSg3uerUwU0bIRCDYiZnX)
     driver-class-name: com.mysql.cj.jdbc.Driver

     #hikari数据库连接池
     hikari:
      pool-name: Retail_HikariCP
      minimum-idle: 5 #最小空闲连接数量
      idle-timeout: 180000 #空闲连接存活最大时间,默认600000(10分钟)
      maximum-pool-size: 10 #连接池最大连接数,默认是10
      auto-commit: true  #此属性控制从池返回的连接的默认自动提交行为,默认值:true
      max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000
      connection-test-query: SELECT 1
  type: com.zaxxer.hikari.HikariDataSource

三、HikariCP连接池速度快于其他连接池的原因

  • 相比于普通连接池,在ConnectionProxy中使用ArrayList来存储Statement对象,HikariCP改用FatList来存储对象,而其中的区别是,ArrayList在每次执行get(Index)方法时,都需要对List的范围进行检查,而FastList不需要,在能确保范围的合法性的情况下,可以省去范围检查的开销。

  • 另外在Java代码中,很多关于Connection的操作,都是在使用完之后直接关闭连接,以前都是从头到尾遍历,来关闭对应的Connection,而HikariCP则是从尾部对Connection集合进行扫描,整体上来说,从尾部开始的性能更好一些。

  • 内部使用一个无锁的集合来存储,并对其中的切换操作做了优化。

  • 从字节码指令的角度去优化,连接池使用
    PROXY_FACTORY.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames))语句来建立statements,resultset等的实例,将其翻译成字节码指令后,会有如下的指令,0: getstatic和15: invokevirtual #69。将上述的方法改为使用 ProxyFactory.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames)),后,就不在需要0: getstatic指令,并且使用了12: invokestatic #67代替了15: invokevirtual #69,前者invokestatic 更容易被JIT优化。另外从堆栈的角度来说,堆栈大小也从原来的5变成了4。

四、HiKariCP和Druid对比

我们所熟知的C3P0,DBCP,Druid, HiKariCP为我们所常用的数据库连接池,其中C3P0已经很久没有更新了。DBCP更新速度很慢,基本处于不活跃状态,而Druid和HikariCP处于活跃状态的更新中,这就是我们说的二代产品了。

HiKariCP

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

Druid

  • Druid提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,
  • 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
  • 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;
  • SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中01毫秒区间50次,110毫秒800次,10100毫秒100次,1001000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;
  • 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。
  • 方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。

总的来说:
1、HiKariCP性能比Druid高
2、HiKariCP是Spring Boot 2+官方支持,和Spring Boot兼容性更好
3、Druid的优势是监控完善,扩展性更好(但拦截过多也会增加框架复杂度以及框架性能)

具体选HiKariCP或Druid视团队具体需求而定,提供Druid的用法 : Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库

参考文章

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个快速开发框架,而Druid是一个高性能的数据库连接池。在Spring Boot中,可以通过配置来使用Druid连接池。 首先,在pom.xml文件中添加Druid的依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> ``` 接下来,在application.properties或application.yml配置文件中添加Druid连接池的相关配置信息: ``` spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,slf4j ``` 其中,关键的配置项包括: - `spring.datasource.url`:数据库连接URL。 - `spring.datasource.username`:数据库用户名。 - `spring.datasource.password`:数据库密码。 - `spring.datasource.driver-class-name`:数据库驱动类名。 - `spring.datasource.type`:连接池类型,这里配置为`com.alibaba.druid.pool.DruidDataSource`。 - `spring.datasource.initialSize`:连接池的初始化大小。 - `spring.datasource.minIdle`:空闲连接的最小数量。 - `spring.datasource.maxActive`:最大活跃连接数。 - `spring.datasource.maxWait`:获取连接的最大等待时间。 - `spring.datasource.timeBetweenEvictionRunsMillis`:定期检查连接池中空闲连接的间隔时间。 - `spring.datasource.minEvictableIdleTimeMillis`:连接在池中最小空闲时间,超过该时间则将被销毁。 - `spring.datasource.validationQuery`:连接校验SQL。 - `spring.datasource.testWhileIdle`:连接空闲时是否进行校验。 - `spring.datasource.testOnBorrow`:从连接池获取连接时是否进行校验。 - `spring.datasource.testOnReturn`:归还连接给连接池时是否进行校验。 - `spring.datasource.poolPreparedStatements`:是否缓存PreparedStatement。 - `spring.datasource.maxPoolPreparedStatementPerConnectionSize`:缓存PreparedStatement的最大数量。 以上就是Spring Boot中使用Druid连接池的详细配置解析,通过适当调整这些配置项,可以实现对连接池的更好性能和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值