连接池优势
我们有一些常用的数据库连接池,连接池的好处有很多
这里直接说应用程序和数据库交互
- 首先通过TCP协议的三次握手和数据库服务器建立连接,然后发送数据库用户账号密码,等待数据库验证用户身份
- 提交SQL语句到数据库执行(可能还有sql的预编译)
- 连接关闭,关闭连接需要和数据库通信,通知断开连接了然后再TCP四次挥手最后完成关闭
池技术的思想采用的是空间换时间的概念.预先完成多个数据库连接对象.在执行大多数sql时,可以省略第一步和第三步,有效提升sql效率
有点类似长连接和短连接.
介绍
C3P0:好久不在维护了,比较老的连接池;历史悠久,代码及其复杂,不利于维护。
DBCP:DBCP更新速度很慢,基本处于不活跃状态;是tomcat自带的连接池,扩展性不强
Druid:性能优秀,扩展性好,自带拦截器实现
HiKariCP:简洁,追求性能,更新维护快,扩展性一般
一般来说考虑连接池,会从Druid和HiKariCP中选一个
这里就要谈维护更新
HiKariCP起源于boneCP,之后被hikariCP替代.这个连接池是springboot默认的连接池,维护更新还是很快的.另外"hikari"是日语:光的意思.大概作者是希望其快
Druid由温绍大神一直在维护,温绍的人品,没的说,p9还一直做技术。可以放心的说,只要他不挂,会维护到底。顺便说一下fastjson也是有他在维护
比较
综合比较图
性能图
表格展示
这里基本可以看出:比较不推荐的是c3p0这个连接池
比较推荐的是:hikari和druid
另外说一句druid连接池功能很全面,在监控、诊断、安全、扩展性这些方面远远超出其他连接池。
连接池本身的性能消耗在整个调用链路中通常占比不大,连接池的性能关键点是:连接是否LRU方式重用(Least Recently Used),是否支持PSCache(PreparedStatementCache)。当然DruidDataSource在没有使用Filter没有打开testOnBorrow的情况下,裸测也是极好。
补充
为什么HiKariCP的性能表现比较亮眼?
- ConcurrentBag:更好的并发集合类实现
解释:核心在于更小的锁粒度,大量采用CAS节省性能 - 使用FastList替代ArrayList
解释:FastList是一个List接口的精简实现,只实现了接口中必要的几个方法。JDK ArrayList每次调用get()方法时都会进行rangeCheck检查索引是否越界,FastList的实现中去除了这一检查,只要保证索引合法那么rangeCheck就成为了不必要的计算开销(当然开销极小)。此外,HikariCP使用List来保存打开的Statement,当Statement关闭或Connection关闭时需要将对应的Statement从List中移除。通常情况下,同一个Connection创建了多个Statement时,后打开的Statement会先关闭。ArrayList的remove(Object)方法是从头开始遍历数组,而FastList是从数组的尾部开始遍历,因此更为高效。 - HikariCP利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理,生成更少的字节码
用一个别人的回答来解释:
个人结论
druid:本身在保证性能下,拥有更加完善的监控,扩展,安全功能
HiKariCP:追求优秀的性能
这里有个链接可以看看:
https://github.com/brettwooldridge/HikariCP/issues/232