在 SpringBoot 1.5 版本中,默认的数据库连接池是 tomcat-jdbc,在 SpringBoot 2.0 版本中已经换成了 HikariCP,HikariCP 被称为性能最高的数据库连接池。
本文介绍 SpringBoot1.5.9 版本(2.0版本无需看本文)整合 HikariCP数据库连接池。
1)Java 8 maven artifact:
2)Java 7 maven artifact:
当然也要排除默认的 tomcat-jdbc 依赖,最终部分如下
其他的没什么要改的啦,关于几个连接池性能以后再测试啦.
以下是在开源中国找到的一篇文章:点此
线程的作用
本文介绍 SpringBoot1.5.9 版本(2.0版本无需看本文)整合 HikariCP数据库连接池。
一、Maven 依赖
1)Java 8 maven artifact:
- <dependency>
- <groupId>com.zaxxer</groupId>
- <artifactId>HikariCP</artifactId>
- <version>2.6.1</version>
- <scope>compile</scope>
- </dependency>
2)Java 7 maven artifact:
- <dependency>
- <groupId>com.zaxxer</groupId>
- <artifactId>HikariCP-java7</artifactId>
- <version>2.4.11</version>
- <scope>compile</scope>
- </dependency>
当然也要排除默认的 tomcat-jdbc 依赖,最终部分如下
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <exclusions>
- <!--排除默认的tomcat-jdbc-->
- <exclusion>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-jdbc</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!--自定义数据库连接池-->
- <dependency>
- <groupId>com.zaxxer</groupId>
- <artifactId>HikariCP</artifactId>
- <version>2.6.1</version>
- <scope>compile</scope>
- </dependency>
二、application.properties
- #### 数据库连接池属性
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- spring.datasource.url=jdbc:mysql://localhost:3306/forum?useSSL=false&useUnicode=true&characterEncoding=utf-8
- spring.datasource.username=root
- spring.datasource.password=123456
- #自动提交
- spring.datasource.default-auto-commit=true
- #指定updates是否自动提交
- spring.datasource.auto-commit=true
- spring.datasource.maximum-pool-size=100
- spring.datasource.max-idle=10
- spring.datasource.max-wait=10000
- spring.datasource.min-idle=5
- spring.datasource.initial-size=5
- spring.datasource.validation-query=SELECT 1
- spring.datasource.test-on-borrow=false
- spring.datasource.test-while-idle=true
- # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- spring.datasource.time-between-eviction-runs-millis=18800
- # 配置一个连接在池中最小生存的时间,单位是毫秒
- spring.datasource.minEvictableIdleTimeMillis=300000
其他的没什么要改的啦,关于几个连接池性能以后再测试啦.
以下是在开源中国找到的一篇文章:点此
测试结论
- 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
- druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
- 综合考虑到目前venus已经支持druid且hikariCP并未发现有太多大规模的生产实践的案例,后续将推荐使用druid并把codegen生成的代码默认连接池为druid。
- 可开启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个 |
线程的作用
- dbcp:一个线程:负责心跳,最小连接数维持,最大空闲时间和防连接泄露。
- druid: 两个线程: 其中一个负责异步创建。一个负责最小连接数的维持。 其中心跳是通过获取连接,来判定是否小于心跳间隔。
- hikariCP: 三个线程: 其中一个为定时线程,解决最大空闲时间。两个为新建连接和关闭连接。 均是连接池,空闲5s,线程便会关闭。
- c3p0: 四个线程;三个helperThread (pollerThread),一个定时AdminTaskTimer(DeadlockDetector)。
由于boneCP被hikariCP替代,并且已经不再更新,boneCP没有进行调研。
proxool网上有评测说在并发较高的情况下会出错,proxool便没有进行调研。
druid的功能比较全面,且扩展性较好,比较方便对jdbc接口进行监控跟踪等。
c3p0历史悠久,代码及其复杂,不利于维护。并且存在deadlock的潜在风险。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏