原创文章,转载请指明出处:http://aub.iteye.com/blog/1404219, 尊重他人即尊重自己

DBCP,C3P0,Tomcat_JDBC 性能及稳定性測试

1.測试环境:

硬件环境:

数据库server:2U*8核 8G内存 

測试server:   2U*8核 6G内存

软件环境:

jdk:

1.6.29

mysql:

5.0.77

mysql_driver:

mysql-connector-java-5.0.8-bin.jar

DBCP:

commons-dbcp-1.4.jar

下载地址: http://commons.apache.org/dbcp/

commons-pool-1.5.6.jar

下载地址: http://commons.apache.org/pool/

C3P0:

c3p0-0.9.1.2.jar

下载地址: http://www.mchange.com/projects/c3p0/index.html

log4j-1.2.8.jar(c3p0须要加入此包)

下载地址: http://logging.apache.org/log4j/

Tomcat_JDBC:

tomcat-jdbc.jar

下载地址: https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

或者在tomcat安装根文件夹下的lib文件夹中直接拿来用之

tomcat-juli.jar

下载地址:(没找到)

在tomcat安装根文件夹下的bin文件夹中直接拿来用之

配置信息:

数据库连接超时时间设置为:   10年

数据库支持最大连接数设置为:2000

初始化连接池大小:10

连接至最小活动线程数:10

连接池最大活动线程数:100

其它配置均保持各个连接池的默认配置

2.性能測试:   (測试代码见附件)

測试点:

在多线程多任务的条件下,各个连接池获取连接然后立即关闭连接,比較所消耗的时间。

在网上看了好多关于数据库连接池方面的測试。

大多数測试过程中,包含了运行sql语句部分,即,创建连接。运行sql语句。关闭连接,

一開始我也是这样測试,

測试过过程中,发现数据非常不稳定, 这几个连接池都是忽快忽慢,

经过思考、分析,个人 认为这样是不准确的。运行sql语句时。測试已经不是数据库连接池的性能了,

全然是数据库驱动程序(比如mysql_driver )和数据库本身的性能,

数据库连接池负责的不过建立DataSource,获取(从连接池中获取)Connection。关闭(放回到连接池)Connection,

因此,

我在測试时,没有计算初始化连接池(建立DataSource)的时间,而是连接池“获取连接然后立即关闭连接”的时间。

測试结果:

平均消耗时间是每一个用例測试了5次计算出来的

DB POOL  线程数量  单线程

运行次数 
平均消耗

时间(ms)
平均单条

时间(ms) 
DBCP 10 1000 251 0.0251
C3P0 10 1000 802.8 0.08028
TomcatJDBC 10 1000 191.8 0.01918
DB POOL  线程数量  单线程

运行次数 
平均消耗

时间(ms)
平均单条

时间(ms) 
DBCP 100 1000 810.4 0.008104
C3P0 100 1000 2248.8 0.022488
TomcatJDBC 100 1000 726 0.00726
DB POOL  线程数量  单线程

运行次数 
平均消耗

时间(ms)
平均单条

时间(ms) 
DBCP 150 1000 1854.4 0.012363
C3P0 150 1000 2990.8 0.019939
TomcatJDBC 150 1000 861 0.00574
DB POOL  线程数量  单线程

运行次数 
平均消耗

时间(ms)
平均单条

时间(ms) 
DBCP 300 1000 3851.8 0.012839
C3P0 300 1000 6233.2 0.020777
TomcatJDBC 300 1000 3403.8 0.011346

结论:

整体性能:TomcatJDBC > DBCP > C3P0

网上好多资料都说C3P0的性能要好于DBCP,从我的測试结果来看并非这样,或许是我的配置有不对的地方,

測试时最大的活动线程配置为100。

并发为150线程时,TomcatJDBC的优势明显,

也就是当并发超过连接池最大的活动线程数,但并没有超过太多的情况下,TomcatJDBC的优势明显,

当并发数为300时。3种连接池性能差距不大。

出现这样的情况,说明连接池的最大活动线程数已经不满足现有系统需求,须要调整配置了

我測试的结果都是毫秒级,

对于一个小型的系统,并发压力不大时,选择哪个连接池都没有太大区别,考虑很多其它的应该是连接池的稳定性。

3.稳定性測试: (測试代码见附件)

測试点:

1.当数据库因为未知原因关闭,又一次启动后,连接池能否够自己主动重连。无需重新启动应用服务。

2.应用服务正常,数据库服务正常,可是网络环境异常,导致连接中断。此时连接池中连接处于“半连接”状态,

现象:

在不重新启动应用服务的情况下。 mysql数据库进行重新启动操作,mysql全然重新启动后。运行程序。

TomcatJDBC和DBCP并没有自己主动重连,反复运行查询语句,会一直报异常。重新启动应用服务后恢复正常

C3P0进行了自己主动重连,反复运行查询语句,运行正常。

结论:

默认配置条件下,TomcatJDBC和DBCP并没有自己主动重连机制,查看官方文档。这缺陷能够通过改动配置解决。

另:

连接池重连机制,有2种:

1.同步验证方式:

每次获取连接或关闭连接时,运行一个提前定义的验证语句(sql语句)。

验证连接池中的连接是否有效,假设验证失败,彻底关闭此连接,

这样的方式会导致每次运行数据库操作时都有额外的开销。对性能影响较大。

2.心跳验证方式:

每隔特定的时间进行一次验证。运行一个提前定义的验证语句(sql语句),

验证连接池中的连接是否有效,假设验证失败,彻底关闭此连接,

能够依据详细情况,适当的调节验证间隔时间。

这样的方式以牺牲较小的性能开销为代价。来保持系统的稳定性。

4.心得

自从tomcat7公布以来,网络上開始出现一个新的连接池的影子,tomcat jdbc,

经过測试,发现tomcat jdbc的性能果然不错,是连接池不二的选择,

本人E文水平有限。没办法把E文翻译的那么优雅。

tomcat jdbc的其它长处,还请看它的官网介绍

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html 



这篇文章具体介绍阐述dbcp与c3p0的一些不足:

Why another connection pool project

重连机制:

不推荐使用同步验证方式。

假设系统架构中。网络环境(应用服务与数据库服务之间)不稳定,硬件环境不稳定,推荐使用心跳验证方式。

假设系统架构中,网络环境和硬件环境都机器稳定。并且对数据库I/O性能要求较高时。能够不进行验证。

5.測试代码见附件:

类:TestPerformance,性能測试

类:TestStability。稳定性測试,定时运行查询语句,

类:TestWacthPool,自己主动重连測试,简单观察连接池内部状态

如有有疑问能够加我QQ:   35443224   请说明您是ITEYE 社区的朋友, ^_^

原创文章,转载请指明出处:http://aub.iteye.com/blog/1404219, 尊重他人即尊重自己

DBCP,C3P0,Tomcat_JDBC 性能及稳定性測试的更多相关文章

  1. DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试

    1.测试环境: 硬件环境: 数据库服务器:2U*8核 8G内存 测试服务器:   2U*8核 6G内存 软件环境: jdk: 1.6.29 mysql: 5.0.77 mysql_driver: my ...

  2. Redis源代码分析(十三)--- redis-benchmark性能測试

    今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...

  3. android 性能測试iozone篇

    一:简单介绍 iozone是一个文件系统的benchmark工具, 用于測试不同的操作系统中文件系统的读写性能, 能够測试下面13种模式 0=write/rewrite 1=read/re-read ...

  4. 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践

    这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...

  5. iOS自己主动化測试的那些干货

    前言 假设有測试大佬发现内容不正确.欢迎指正,我会及时改动. 大多数的iOS App(没有持续集成)迭代流程是这种 也就是说.測试是公布之前的最后一道关卡.假设bug不能在測试中发现,那么bug 就会 ...

  6. LINPACK測试

    1简单介绍 LINPACK是线性系统软件包(Linear system package) 的缩写. Linpack如今在国际上已经成为最流行的用于測试高性能计算机系统浮点性能的benchmark.通过 ...

  7. 【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份

    Android自己主动化測试框架和工具在四年多的发展日趋成熟. 从五年前的第一代自己主动化架构演进到眼下第四代(本系列讲座第7篇后将具体剖析第三代和第四代自己主动化框架)从曾经最早谷歌推崇的monke ...

  8. .Net站点架构设计(八)測试

    .Net站点架构时间(八)測试 一般而言.总体測试策略是:先针对部分系统进行性能及压力測试,得到各部分的峰值处理性能:再模拟总体流程測试,此时倒不用依照峰值跑,重点測试总体业务流程及业务预期负荷. 在 ...

  9. 随想录(做自己代码的測试project师)

    [ 声明:版权全部.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 非常多project师都有一个不好的习惯,由于大多数itproject师都喜欢写代码.可是不喜欢 ...

随机推荐

  1. js 给url添加时间戳 解决浏览器缓存

    //解决浏览器缓存 function timestamp(url){      //  var getTimestamp=Math.random(); var getTimestamp=new Dat ...

  2. vue 常用功能和命令

    1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init we ...

  3. IIS添加更改默认页面

    服务器中打开IIS管理器,选择默认文档,双击即可进入编辑:

  4. vue中去掉烦人的格式警告(eslint )

    解决办法: 一,源头上解决,下次创建项目时就不要使用eslint连接项目代码 如上图所示,就是在这一步的时候选择no: 二,在build文件夹中找到webpack.base.conf.js文件 找到右 ...

  5. 原生js上传图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 浏览器通知Web Notifications实例页面

    HTML代码: <button id="button">有人想加你为好友</button> <p id="text">< ...

  7. C#语言中循环分类总结

    C#语言中,循环主要分为4种,分别是:while循环.do while循环.for循环.foeach循环.下面我将分类对循环语句总结. 1.while循环: 如果循环条件为真,则执行循环体:执行完循环 ...

  8. php使用命名空间时自动加载机制

    命名空间主要为了解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突.不过并不是你定义了使用命名空间的类,就可以在任何地方随意使用了,需要在程序运行时将定义命名空间的类文 ...

  9. [Python3网络爬虫开发实战] 1.7.1-Charles的安装

    Charles是一个网络抓包工具,相比Fiddler,其功能更为强大,而且跨平台支持得更好,所以这里选用它来作为主要的移动端抓包工具. 1. 相关链接 官方网站:https://www.charles ...

  10. c++基础_矩阵乘法

    #include <iostream> using namespace std; int main(){ int a,b; cin>>a>>b; long c[a] ...