连接池性能比较,你还在用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)

连接池性能比较,你还在用C3P0么

多线程(500线程分别获取/释放100个连接,连接池大小50-200)

连接池性能比较,你还在用C3P0么


        以上图片来源于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么的主要内容,如果未能解决你的问题,请参考以下文章

有关Hikaricp连接池配置的解读

c3p0数据库连接池的使用详解

c3p0在spring中的配置

Java使用C3P0数据库连接池的方法

Hibernate三种连接池对比

主流Java语言数据库连接池比较及前瞻