1. 连接池是什么?
连接池是一种用于提高具有动态数据库驱动内容的应用程序性能的技术。打开和关闭数据库连接可能看起来不是昂贵的费用,但它可以相当快地加起来。假设建立连接需要5ms,执行查询需要5ms(完全编号),50%的时间是建立连接。将此扩展到数千或数万个请求,并且浪费了大量网络时间。连接池本质上是开放数据库连接的缓存。打开并使用数据库连接而不是关闭它后,将其添加回池中。当你去获取一个新连接时,如果池中有一个可用,它将使用该连接而不是建立另一个连接
2. 为什么要用连接池?
- 频繁地打开和关闭连接可能很昂贵。缓存和重用。数据库压力问题。
- 当活动激增时,您可以限制与数据库的连接数。这将强制代码阻塞,直到连接可用。这在分布式环境中尤其有用。
- 将常见操作拆分为多个池。例如,您可以拥有一个指定用于OLAP连接的池和一个用于OLTP连接的池,每个连接具有不同的配置
3. 有哪些数据库连接池?
proxool
更新时间截止2008年。速度可以,稳定性稍差,发较高的情况下会出错。
c3p0
太古老,代码及其复杂,不利于维护。貌似都比它强。
dbcp
是 apache上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
druid
是alibba出品的一个功能比较全面,且扩展性较好的数据库连接池,比较方便对jdbc接口进行监控跟踪等。
BoneCP
13年前最快的连接池项目。2013年后不再更新,心灰意冷。
HikariCP
光连接池,目前被SpringBoot2官方推荐使用的数据库连接池。
4. 各数据库连接池测试结论
1:性能方面 HikariCP>Druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。
2:druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。
3:综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。
4:可开启prepareStatement缓存,对性能会有大概20%的提升。
5.各数据库连接池功能对比
功能 | dbcp | druid | c3p0 | tomcat-jdbc | HikariCP |
是否支持PSCache | 是 | 是 | 是 | 否 | 否 |
监控 | jmx | jmx/log/http | jmx,log | jmx | jmx |
扩展性 | 弱 | 好 | 弱 | 弱 | 弱 |
sql拦截及解析 | 无 | 支持 | 无 | 无 | 无 |
代码 | 简单 | 中等 | 复杂 | 简单 | 简单 |
更新时间 | 2019.02 | 2019.05 | 2019.03 | 2019.02 | |
最新版本 | 2.60 | 1.1.17 | 0.9.5.4 | 3.3.1 |
特点 | 依赖于common-pool | 阿里开源,功能全面 | 历史久远,代码逻辑复杂,且不易维护 | 优化力度大,功能简单,起源于boneCP |
连接池管理 | LinkedBlockingDeque | 数组 | FairBlockingQueue | threadlocal+CopyOnWriteArrayList |
总结:
- 由于boneCP被hikariCP替代,并且已经不再更新,boneCP没有进行调研。
- proxool网上有评测说在并发较高的情况下会出错,proxool便没有进行调研。
- druid的功能比较全面,且扩展性较好,比较方便对jdbc接口进行监控跟踪等。
- c3p0历史悠久,代码及其复杂,不利于维护。并且存在deadlock的潜在风险。
分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。