`
duzc2
  • 浏览: 59487 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java连接池性能测试报告

阅读更多

  当前问题

1  高并发异常

         目前应用的 Proxool 连接池,在高并发情况下会出现:

         1. DataSource.getConnection() 方法会根据 ProxoolDataSource.simultaneousBuildThrottle 限制连接创建的并发,超出限制将抛出 java.sql.SQLException: We are already in the process of making 11 connections and the number of simultaneous builds has been throttled to 10 异常;

         2. 当满足条件 “connectionCount >= getDefinition().getMaximumConnectionCount() && connectionPool.getAvailableConnectionCount() < 1” 时, DataSource.getConnection() 方法将抛出 java.sql.SQLException: Couldn't get connection because we are at maximum connection count (200/200) and there are none available 异常;

         3. 当满足条件 connectionCount >= getDefinition().getMaximumConnectionCount() ” DataSource.getConnection() 方法将抛出 java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: ConnectionCount is 200. Maximum connection count of 200 cannot be exceeded. 异常。

         第一种异常可以修改配置文件,增加 simultaneousBuildThrottle 避免,但后两种情况只能增加数据库连接。并发量大于数据库连接数,必然会报后两种异常。可见 Proxool 并未具有完整的连接池实现,其尚未具有处理高并发应用的能力。

 

2  多连接数

         为减少以上情况的发生,必须设置 Proxool 数据库连接数大于等于业务线程数

         当业务线程数为 300 时,数据库连接池的最大连接数必须大于三百。这里说 大于 ,意义是即使业务线程数为 300 、数据库连接数为 300 ,也不能保证不报后两种异常。

         维持过多的连接对于数据可游戏服务器都有一定的资源浪费,而且有碍新的服务器分布式、集群的实现。

  替代方案

         经过网上搜索,找到其他连接池实现: DBCP Tomcat JDBC Pool DBPool C3P0 BoneCP Db Connection Broker MiniConnectionPoolManager

         DBCP Tomcat6 默认连接池,但 1.2 版本倍受缓慢诟病,最新版本为 1.4 Tomcat JDBCPool Tomcat Tomcat7 中保留 DBCP 连接池以兼容使用 DBCP 连接池的已有应用,并提供新的 Tomcat JDBC Pool 作为 DBCP 的可选替代,修改一行配置文件即可启用 [1] DBPool ObjectWeb 开源产品,但多年未维护。 C3P0 Hibernate 默认连接池。 BoneCP 为新兴产品,网上评价极高。

         Db Connection Broker MiniConnectionPoolManager 是两个轻量级连接池,实现只有 1 个类。

1  API

         其中 DBCP C3P0 已被广泛应用,可以认为稳定可靠。

         Db Connection Broker MiniConnectionPoolManager 未提供 javax.sql.DataSource 接口实现,不予考虑。

         经过对 API 和部分代码的研究,除 Proxool 以外所有连接池均有无可分配链接时让线程等待的功能,并提供超时参数或等价替代方案,超时未取得连接则抛出异常。

2  性能

         为测试连接池性能,撰写测试程序,多线程无延迟持续查询“ select 1 ”,分别测试单位时间内查询次数。

1 在双核、 3G 内存,最大连接 5 ,发连接改为 4 BoneCP 2 区,不计算预热阶段,持续时间 1 分钟:


Proxool 虽然在性能上远超 DBPool ,但第一次测试报 3 次异常,第三次测试报 2 次异常,均为第三种异常“ ProxoolException: ConnectionCount is 5. Maximum connection count of 5 cannot be exceeded. ”,线程数小于连接数竟然还报错,不可容忍; C3P0 明显领先; DBCP 紧随其后,可见两大著名连接池果然给力;新星 BoneCP 一度超越 DBCP ,平均成绩名列第三; TomcatPool 排在第四,但性能稳定。

 

2 在双核、 3G 内存,最大连接 5 ,并发线程 500 BoneCP 2 区,持续三分钟,不计算预热阶段,测试三次,测试结果如下:


 

TomcatPool 在高并发低连接数情况下,性能稍强于 DBCP ,但不明显; BoneCP Tomcat DBCP 甩在后面; C3P0 表现一般; DBPool 稳稳淘汰。

 

3 4 cpu 1000 线程、 200 连接、 BoneCP 100 区,连续 15 分钟,不计算预热阶段,测试次数结果如下( DBPool 在多次测试结果中远远落后于其他,为节约时间这次未参与测试):


可见 DBCP 在高并发、高连接数情况下,查询量远远超过位于第三代 C3P0 并甩开后两名十万次左右; BoneCP TomcatPool 性能接近; C3P0 远远落后前三者。

 

         高并发时 visualvm 线程状态记录如下:



 

 

 

 

         从线程状态记录中可见, DBCP TomcatPool 可以快速的交付连接,在途中形成琐碎的绿色条带, DBCP 图中有 3 处可忽略的红色条带,而 TomcatPool 在线程启动时被锁一段时间。 C3P0 大量使用同步锁,产生了大量的红色条带。QueryThread线程为 BoneCP查询线程, 没有使用同步锁。 DBPool 基本上全部使用同步机制,导致大量线程等待。

由于没有对源代码深入分析,尚不知 BoneCP 为何落后 TomcatPool DBCP

 

         综上所述,新版 DBCP 连接池仍然是一款高性能的杰作。

 

后记

以上列出仅为典型测试数据,本次测试实际耗时将近一周,大量数据未能展示。

在一些记录中显示,项目工程中包含的 DBCP 1.2 的性能确实不如人意,仅仅超过 DBPool 这款同样古老的同胞,但新版 DBCP 1.4+commons pool 1.6 的绝佳配合将 DBCP 的性能推进到一个新的高峰。下图为 DBCP 1.2 的线程状态:


BoneCP 这一新兴在速度上给人相当大的惊喜,但其内存回收依赖于独立线程,默认情况下 BoneCP 会启动很多附加线程,其中大部分线程将保留到程序结束。利用其它线程回收未关闭的 connection statement result 带来的结果是,如果未关闭 statement result ,而只关闭 connection ,那么 statement result 将延迟回收,在如此高并发、高频率的测试中这样的延迟回收将导致一分钟之内将 2G 内存装满、程序崩溃。

下图为部分附加线程,实际情况要好长的列表,截图不下来了。。


下图为业务线程结束,并且已经对数据源 close 操作之后,仍然有部分线程持续运行。

 

 

下图右上角图像显示 proxool 的内存占用大于其他,而右下角图像显示 BoneCP 线程数远远大于其他。


 



[1]      http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

  • 大小: 31.5 KB
  • 大小: 24.1 KB
  • 大小: 7.5 KB
  • 大小: 51.1 KB
  • 大小: 49.3 KB
  • 大小: 48.9 KB
  • 大小: 27.5 KB
  • 大小: 38.5 KB
  • 大小: 33.2 KB
  • 大小: 15.3 KB
  • 大小: 15.1 KB
  • 大小: 28.5 KB
2
0
分享到:
评论
10 楼 suifeng214 2014-03-28  
想问一下 楼主高并发是怎样测试的
9 楼 chaodongyue 2012-10-14  
求测试代码
8 楼 Litsky 2012-09-08  
  人才哥啊 ………… ,刚把c3p0换成 BoneCP ……  噩耗啊,一直不知道“BoneCP 大部分线程将保留到程序结束”
找个新的dbcp试试去,很感谢楼主给上了这么一课
7 楼 duzc2 2012-09-07  
tiwenzhuanyong 写道
感谢楼主的辛苦测试,受益了

客气了,分享才有进步。我也要跟很多人去学习。
6 楼 tiwenzhuanyong 2012-09-05  
感谢楼主的辛苦测试,受益了
5 楼 duzc2 2012-06-29  
Black_Sun 写道
楼主可以把测试的代码放出来吗?学习一下!

哎呀,那个代码很简单,就写了一个工厂类,提供这几个数据源导出的 DataSource ,然后再协议个测试类,从工厂类里面取个数据源,然后开不同数量的线程,循环指定次数或者持续指定时间的查询 select 1。
由于sql简单,返回速度快,可以将线程间争抢资源的性能损耗凸显出来。
4 楼 Black_Sun 2012-06-27  
楼主可以把测试的代码放出来吗?学习一下!
3 楼 刘家四弟 2012-05-21  
duzc2 写道
刘家四弟 写道
你好,请问visualvm 线程状态记录是用什么工具

visualvm 就是jdk的bin目录下面那个。

哦哦,谢谢
2 楼 duzc2 2012-05-21  
刘家四弟 写道
你好,请问visualvm 线程状态记录是用什么工具

visualvm 就是jdk的bin目录下面那个。
1 楼 刘家四弟 2012-05-21  
你好,请问visualvm 线程状态记录是用什么工具

相关推荐

    java高性能数据库连接池V5.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    java高性能数据库连接池V2.0

    数据库连接池,是一种相当实用的应用程序。它可以保存、维护及创建用户所需的数据库连接。从而使得用户得到一个连接的时间降低90%以上。大大提升了数据库访问的反应时间。 这个是一个开源的代码。大家可以修改它、...

    基于Java数据库连接池的研究与创新

    面向对象软件设计是当今软件设计模式的潮流,而基于面向对象软件设计...通过实验测试及连接时间的对比分析,看到了4种方法性能的差别,验证了文中提出的新型连接池的访问时间最优,可以极大地提高数据库的访问效率。

    java数据库连接池

    连接池的基本工作原理 1、基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效治理。 我们知道,对于共享资源,有一个很闻名的设计模式:资源池(Resource Pool)。 该模式正是为了...

    R2数据库连接池高性能连接池v1.3

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...

    R2高性能数据库连接池v1.5源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    高性能的分布式数据库连接池clearpool.zip

    clearpool和其它流行的数据库连接池的性能比较请运行测试用例:https://github.com/xionghuiCoder/clearpool/blob/master/src/test/java/org/opensource/clearpool/CompareWithPopularPool.java。 标签...

    R2数据库连接池高性能连接池v1.2

    v1.2处理了oracle环境下由于服务器关闭休眠链接造成的连接池循环检测进程异常退出的情况,改为当循环周期大于服务器关闭休眠链接间隔时,后台打印异常并重新连接数据库。 R2 jdbc连接池,用于java程序中jdbc连接池...

    java数据库连接池-bonecp java源码

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。

    Java_jdbc数据库连接池总结

    对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的...更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

    R2高性能数据库连接池v1.6源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在...

    proxool数据库连接池实例(带监控功能)

    proxool数据库连接池实例源码,性能很不错的一个连接池,带监控功能可以方便检测数据库没有关闭的连接

    R2高性能数据库连接池v1.3源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请...

    R2高性能数据库连接池v1.8改进版源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    R2高性能数据库连接池v1.7源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    R2高性能数据库连接池v1.8源码

    R2 jdbc连接池,用于java程序中jdbc连接池的配置管理,可应用于非web项目(纯java项目),全参数化配置。 应用时,先用rar打开jar包,拷贝r2.properties文件到class目录,并修改参数。 本包需要用到log4j,请在调用...

    阿里druid数据库连接池

    阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好。

    java开源包4

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包11

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包6

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

Global site tag (gtag.js) - Google Analytics