连接池性能比较,你还在用C3P0么
Posted 木子道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接池性能比较,你还在用C3P0么相关的知识,希望对你有一定的参考价值。
这篇文章思路来源于项目中使用Druid连接池SQL监控功能。顺着思路挖掘才有了写这篇文章的想法。
一、连接池是什么?
它是创建和管理数据库连接的缓冲技术。在使用JDBC的时候,需要创建和关闭连接。频繁创建和关闭是比较耗资源。连接池就很好的解决这类问题。它是维护了一堆长连接,需要的时候拿来用就行了,用完之后也不需要断开,把它还回连接池中就行。总结两点。第一、节省创建、关闭连接时间和资源消耗。第二、起到复用的作用。
二、连接池分类
以下几款数据库连接池你是否全部熟悉呢?不管你以前知不知道它们存在,不要暴露自己是菜鸟的身份。现在让我来悄悄告诉你。
c3p0
它一个成熟的,高度并发的JDBC连接池库,支持PreparedStatements的缓存和重用。
它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3p0对我还是有感情的,是我使用的第一款数据库连接池。下面让我来聊聊它是怎么被打入冷宫。
DBCP
DBCP(DataBase connection pool)数据库连接池。是 Apache 上的一个 Java连接池项目,也是 Tomcat 使用的连接池组件。由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
Tomcat-JDBC
Tomcat JDBC 是Apache Commons DBCP连接池的替代或替代。
Tomcat JDBC 池实现了异步检索连接的能力,而不需要为库本身添加额外的线程。
Proxool
一个Java SQL驱动程序,提供一个连接池包装另一个您选择的驱动程序。 迁移现有代码非常简单。 完全可配置。 快速,成熟和健壮。 透明地将连接池添加到现有的JDBC驱动程序。
这个项目不再积极维护。 自2006年以来,我一直没有使用Proxool,甚至不再使用Java。 如果项目有任何生存的机会,就需要找一个新的维护者。 如果任何人都可以推荐一个好的选择,我会很高兴在这里提到它。 另外,如果有人想为这个项目做出贡献,那么请创建一个拉取请求。
上面那段话是作者原话。当我们使用一款APP,出现BUG无人更新和维护,你还会使用它吗?下面不过多的讲述。
Druid
Druid是一个JDBC组件库,包括数据库连接池、SQL Parser等组件。由阿里巴巴开发,为监控而生的数据库连接池。Druid能够提供强大的监控和扩展功能。
BoneCP
BoneCP是一个快速、开源的数据库连接池(JDBC Pool)库。 通过最大限度地减少锁地竞争,为您的应用程序提高更高的吞吐量,从而实现高性能。
BoneCP本身并不“健全”,它的很多特征都依赖于Guava,因此也就和DBCP一样,面临更 新乏力的问题。
它比C3P0和DBCP旧的连接池更胜一筹(自称性能是C3p0的25倍),但现在选择弃用,支持HikariCP,下面我来说说它为什么选择弃用,而支持HikariCP?
HikariCP
HiKariCP是高性能JDBC连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池。HikariCP可以说是BoneCP的二代产品(HikariCP自己在官网上声称在BoneCP的基础上,做了很多优化),它在设计思路上和BoneCP完全一致,主打的特征也是超强的性能表现。
三、性能比对
1.首先我们来根据Druid给出性能对比测试数据
测试目的:执行申请归还连接1,000,000次总耗时性能对比。
Java6 环境
OS | CPU | JVM |
---|---|---|
OSX 10.8.2 | intel i7 2GHz 4core | Java Version 1.6.0_37 |
Java6 测试结果
连接池线程数 | 1线程 | 2 | 5 | 10 | 20 | 50 |
---|---|---|---|---|---|---|
Druid | 1,102 | 1,509 | 1,889 | 1,904 | 2,027 | 1,977 |
Tomcat-JDBC | 1,399 | 1,378 | 2,257 | 2,289 | 2,305 | 2,503 |
DBCP | 3,144 | 3,834 | 6,276 | 6,408 | 6,564 | 6,783 |
BoneCP | 4,327 | 3,598 | 3,800 | 5,242 | 9,402 | 19,066 |
C3P0 | 18,570 | 19,467 | 15,270 | 19,294 | 28,195 | 66,677 |
Proxool | 16,221 | 14,455 | 24,688 | 38,905 | 48,087 | 58,238 |
Java7 环境
OS | CPU | JVM |
---|---|---|
OSX 10.8.2 | intel i7 2GHz 4core | Java Version 1.6.0_37 |
Java7 测试结果
连接池线程数 | 1线程 | 2 | 5 | 10 | 20 | 50 |
---|---|---|---|---|---|---|
Druid | 898 | 1,191 | 1,324 | 1,362 | 1,325 | 1,459 |
Tomcat-JDBC | 1,269 | 1,378 | 2,029 | 2,103 | 1,879 | 2,025 |
DBCP | 2,324 | 5,055 | 5,446 | 5,476 | 5,524 | 5,415 |
BoneCP | 3,738 | 3,150 | 3,194 | 5,682 | 11,018 | 13,125 |
C3P0 | 10,841 | 13,667 | 10,670 | 11,055 | 14,595 | 20,635 |
Proxool | 16,337 | 16,187 | 18,310 | 25,945 | 33,706 | 39,508 |
测试结论
1.Druid是性能最好的数据库连接池,Tomcat-JDBC与Druid性能接近
2.Proxool在激烈并发时会抛异常,完全不靠谱
3.C3P0和Proxool相当慢,慢到影响SQL执行效率
4.BoneCP性能并不优越,采用LinkedTransferQueue并没有能够获得性能提升
2.根据BoneCP官网给出的性能数据
单线程(1,000,000获取/释放连接请求,连接池大小20-50)
多线程(500线程分别获取/释放100个连接,连接池大小50-200)
以上图片来源于BoneCP官网,通过以上图片可以看出BoneCP远远超过C3P0和DBCP连接池。
3.根据HiKariCP官网给出的性能数据
通过上图来源HikariCP官网,可以看出HikariCP远远超过其它连接池的性能。
HikariCP官网总结如下
HikariCP包含一个名为ConcurrentBag的自定义无锁集合。 ConcurrentBag在无锁设计中提供了ThreadLocal缓存以及排队窃取功能,提供了高度的并发性,并最大限度地减少了错误共享。
在ArrayList 被替换为自定义类FastList,它消除了范围检查,并执行从尾到头的移除扫描。这样避免了ArrayList的get()重新检查排序和remove()从头扫描特性。从而提高并发读写速度。
字节码级别,优化代码, 直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码。
HikariCP包含许多微型优化,单独几乎不可测量,但是它们合在一起用于提升整体性能。其中的一些优化是在数百万分之一毫秒的时间内测量的。
----------------------------------------------------------------------------------------------------------------------
HikariCP是一个字节码级别,代码量较少,来看看下面几款代码量。
尽管代码行数并不是复杂性的直接表示,但冗长性和可理解性之间存在着无可争议的相关性。 业内人士普遍认为,每1000行代码中的错误数量在项目和语言之间是相当一致的。 (代码量越多执行效率会更低,错误也会更多)
Pool | Files | Code |
---|---|---|
HikariCP | 34 | 2228 |
Tomcat-JDBC | 31 | 6345 |
BoneCP | 49 | 7293 |
C3P0 | 120 | 15550 |
数据库中断测试(连接超时参数为5s)
HikariCP每5秒抛出超时异常。
C3P0起初没有响应,因为它被卡在验证查询中,但大约2分钟唤醒过来,返回一个错误。 不幸的是,它似乎没有兑现5秒的超时时间。
Tomcat大约在55秒后唤醒,获取连接时返回一个错误,没有等待超时参数配置(5s),而是直接返回错误。
BoneCP 大约在55秒唤醒过来,有了正常反应,并且会等待5秒钟之后返回错误。
HikariCP主观评分
Pool | Grade | Reason |
---|---|---|
HikariCP | A | 正确处理连接超时 |
C3p0 | D | 看似挂起,直到Os TCP超时限制 |
DBCP2 | D | 看似挂起,直到Os TCP超时限制 |
四、功能对比
pool | PSCache | 更新维护 | 扩展性 | SQL拦截监控 | 连接池管理 |
---|---|---|---|---|---|
HiKariCP | 是 | 是 | 弱 | 无 | Threadlocal+CopyOnWriteArrayList |
Druid | 是 | 是 | 好 | 有 | 数组 |
Tomcat-JDBC | 是 | 是 | 弱 | 无 | FairBlockingQueue |
BoneCP | 是 | 否 | 弱 | 无 | LinkedTransferQueue |
DBCP | 是 | 否 | 弱 | 无 | LinkedBlockingDeque |
C3p0 | 是 | 否 | 弱 | 无 |
五、性能对比结论
1.性能排序:HikariCP>Druid>Tomcat-JDBC>BoneCP>DBCP>C3P0。
2.Druid功能全面、国内文档较多、有着SQL拦截和监控统计、良好扩展性。(推荐使用)
3.Proxool 速度可以、稳定性稍差、高并发的容易出错。 2006年后不再更新。
4.C3P0 太古老、代码及其复杂、不利于维护,连接中断需要2分钟时间才能检测到。随着并发升高,性能急剧下降。现在打入冷宫。 (最不推荐使用)
5.DBCP完全被Tomcat -JDBC替代。
6.BoneCP是2013年前最快的连接池项目。被HikariCP替换。2013年后不再更新。
7.HikariCP 在BoneCP基础上进行了优化并超越BoneCP,导致BoneCP弃用。从而支持HikariCP光连接池,国内文档较少。HiKariCP性能最优最主要原因是避免锁的竞争。
六、总结
阅读英文文档真是一件很有挑战的一件事。
---▼长按二维码关注我▼---
2018年请与我一起前行
参考资料
http://jolbox.com/index.html BoneCP官网 无中文
https://github.com/wwadge/bonecp BoneCP Github网站 无中文
https://github.com/brettwooldridge/HikariCP HikariCP Github网站 无中文
https://github.com/alibaba/druid Druid Github网站 提供中英语言
http://brettwooldridge.github.io/HikariCP/ HikariCP网站
https://github.com/alibaba/druid/wiki/ Druid常见问题
https://github.com/brettwooldridge/HikariCP/wiki HikariCP常见问题 无中文
以上是关于连接池性能比较,你还在用C3P0么的主要内容,如果未能解决你的问题,请参考以下文章