SpringBoot使用HikariCP数据库连接池

SpringBoot 1.5 版本中,默认的数据库连接池是 tomcat-jdbc,在 SpringBoot 2.0 版本中已经换成了 HikariCP,HikariCP 被称为性能最高的数据库连接池。

本文介绍 SpringBoot1.5.9 版本(2.0版本无需看本文)整合 HikariCP数据库连接池。

 

一、Maven 依赖

1)Java 8 maven artifact:

  1. <dependency>
  2.     <groupId>com.zaxxer</groupId>
  3.     <artifactId>HikariCP</artifactId>
  4.     <version>2.6.1</version>
  5.     <scope>compile</scope>
  6. </dependency>

2)Java 7 maven artifact:

  1. <dependency>
  2.         <groupId>com.zaxxer</groupId>
  3.         <artifactId>HikariCP-java7</artifactId>
  4.         <version>2.4.11</version>
  5.         <scope>compile</scope>
  6. </dependency>

 

当然也要排除默认的 tomcat-jdbc 依赖,最终部分如下

  1. <dependency>
  2.      <groupId>org.springframework.boot</groupId>
  3.      <artifactId>spring-boot-starter-web</artifactId>
  4.      <exclusions>
  5.          <!--排除默认的tomcat-jdbc-->
  6.          <exclusion>
  7.              <groupId>org.apache.tomcat</groupId>
  8.              <artifactId>tomcat-jdbc</artifactId>
  9.          </exclusion>
  10.      </exclusions>
  11.  </dependency>
  12.  <!--自定义数据库连接池-->
  13.  <dependency>
  14.      <groupId>com.zaxxer</groupId>
  15.      <artifactId>HikariCP</artifactId>
  16.      <version>2.6.1</version>
  17.      <scope>compile</scope>
  18.  </dependency>

 

二、application.properties

  1. #### 数据库连接池属性
  2. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  3. spring.datasource.url=jdbc:mysql://localhost:3306/forum?useSSL=false&useUnicode=true&characterEncoding=utf-8
  4. spring.datasource.username=root
  5. spring.datasource.password=123456
  6. #自动提交
  7. spring.datasource.default-auto-commit=true
  8. #指定updates是否自动提交
  9. spring.datasource.auto-commit=true
  10. spring.datasource.maximum-pool-size=100
  11. spring.datasource.max-idle=10
  12. spring.datasource.max-wait=10000
  13. spring.datasource.min-idle=5
  14. spring.datasource.initial-size=5
  15. spring.datasource.validation-query=SELECT 1
  16. spring.datasource.test-on-borrow=false
  17. spring.datasource.test-while-idle=true
  18. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  19. spring.datasource.time-between-eviction-runs-millis=18800
  20. # 配置一个连接在池中最小生存的时间,单位是毫秒
  21. spring.datasource.minEvictableIdleTimeMillis=300000

 

其他的没什么要改的啦,关于几个连接池性能以后再测试啦.

以下是在开源中国找到的一篇文章:点此

测试结论

  1. 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
  2. druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
  3. 综合考虑到目前venus已经支持druid且hikariCP并未发现有太多大规模的生产实践的案例,后续将推荐使用druid并把codegen生成的代码默认连接池为druid。
  4. 可开启prepareStatement缓存,对性能会有大概10%的提升。

功能对比

功能 dbcp druid c3p0 tomcat-jdbc HikariCP
是否支持PSCache
监控 jmx jmx/log/http jmx,log jmx jmx
扩展性
sql拦截及解析 支持
代码 简单 中等 复杂 简单 简单
更新时间 2018.1.13 2018.1.14 2017.5.4 2018.1.14
特点 依赖于common-pool 阿里开源,功能全面 历史久远,代码逻辑复杂,且不易维护 优化力度大,功能简单,起源于boneCP
连接池管理 LinkedBlockingDeque 数组 FairBlockingQueue threadlocal+CopyOnWriteArrayList
线程 1个线程(心跳) 2个线程 4个 3个

线程的作用

  1. dbcp:一个线程:负责心跳,最小连接数维持,最大空闲时间和防连接泄露。
  2. druid: 两个线程: 其中一个负责异步创建。一个负责最小连接数的维持。 其中心跳是通过获取连接,来判定是否小于心跳间隔。
  3. hikariCP: 三个线程: 其中一个为定时线程,解决最大空闲时间。两个为新建连接和关闭连接。 均是连接池,空闲5s,线程便会关闭。
  4. c3p0: 四个线程;三个helperThread (pollerThread),一个定时AdminTaskTimer(DeadlockDetector)。
    由于boneCP被hikariCP替代,并且已经不再更新,boneCP没有进行调研。
    proxool网上有评测说在并发较高的情况下会出错,proxool便没有进行调研。
    druid的功能比较全面,且扩展性较好,比较方便对jdbc接口进行监控跟踪等。
    c3p0历史悠久,代码及其复杂,不利于维护。并且存在deadlock的潜在风险。

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
言曌

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: