`
endual
  • 浏览: 3557975 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试(转)

 
阅读更多

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

 

1.测试环境:

硬件环境:

数据库服务器:2U*8核 8G内存 
测试服务器:   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)的时间,而是连接池“获取连接然后马上关闭连接”的时间。

 

测试结果:

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 10 1000 251 1328863445815.00 1328863446066.00 251 0.0251
252 1328863466569.00 1328863466821.00
251 1328863477174.00 1328863477425.00
254 1328863487555.00 1328863487809.00
247 1328863499474.00 1328863499721.00
C3P0 10 1000 781 1328863372064.00 1328863372845.00 802.8 0.08028
789 1328863385489.00 1328863386278.00
879 1328863401335.00 1328863402214.00
773 1328863413608.00 1328863414381.00
792 1328863424693.00 1328863425485.00
TomcatJDBC 10 1000 191 1328863272642.00 1328863272833.00 191.8 0.01918
197 1328863303126.00 1328863303323.00
187 1328863313262.00 1328863313449.00
195 1328863324253.00 1328863324448.00
189 1328863334700.00 1328863334889.00

 

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 100 1000 786 1328862922748.00 1328862923534.00 810.4 0.008104
853 1328862939832.00 1328862940685.00
810 1328862955354.00 1328862956164.00
807 1328862981344.00 1328862982151.00
796 1328862994825.00 1328862995621.00
C3P0 100 1000 2517 1328863021884.00 1328863024401.00 2248.8 0.022488
2340 1328863040949.00 1328863043289.00
1968 1328863075044.00 1328863077012.00
2256 1328863092216.00 1328863094472.00
2163 1328863114138.00 1328863116301.00
TomcatJDBC 100 1000 752 1328863155803.00 1328863156555.00 726 0.00726
725 1328863171617.00 1328863172342.00
694 1328863183983.00 1328863184677.00
703 1328863195628.00 1328863196331.00
756 1328863209798.00 1328863210554.00

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 150 1000 1919 1328861533609.00 1328861535528.00 1854.4 0.012363
1957 1328861551638.00 1328861553595.00
1869 1328861746964.00 1328861748833.00
1916 1328861791533.00 1328861793449.00
1611 1328861832003.00 1328861833614.00
C3P0 150 1000 2726 1328861869415.00 1328861872141.00 2990.8 0.019939
2570 1328861895349.00 1328861897919.00
3342 1328861912351.00 1328861915693.00
3218 1328861929664.00 1328861932882.00
3098 1328861950163.00 1328861953261.00
TomcatJDBC 150 1000 877 1328861974599.00 1328861975476.00 861 0.00574
821 1328861990969.00 1328861991790.00
890 1328862016507.00 1328862017397.00
857 1328862037077.00 1328862037934.00
860 1328862052490.00 1328862053350.00

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 300 1000 3908 1328862516139.00 1328862520047.00 3851.8 0.012839
3850 1328862408362.00 1328862412212.00
3939 1328862440877.00 1328862444816.00
3806 1328862469116.00 1328862472922.00
3756 1328862495883.00 1328862499639.00
C3P0 300 1000 6111 1328862711585.00 1328862717696.00 6233.2 0.020777
5162 1328862618669.00 1328862623831.00
6261 1328862638870.00 1328862645131.00
6832 1328862659598.00 1328862666430.00
6800 1328862681808.00 1328862688608.00
TomcatJDBC 300 1000 3458 1328862152316.00 1328862155774.00 3403.8 0.011346
3376 1328862308211.00 1328862311587.00
3397 1328862227685.00 1328862231082.00
3342 1328862261681.00 1328862265023.00
3446 1328862358400.00 1328862361846.00

 

结论:

总体性能:TomcatJDBC > DBCP > C3P0

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

 

测试时最大的活动线程配置为100,并发为150线程时,TomcatJDBC的优势明显,

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

 

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

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

 

3.稳定性测试:

测试点:

1.当数据库由于未知原因关闭,重新启动后,连接池是否可以自动重连,无需重启应用服务。

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

 

 

现象:

在不重启应用服务的情况下, mysql数据库进行重启操作,mysql完全重启后,执行程序,

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

C3P0进行了自动重连,重复执行查询语句,执行正常。

 

结论:

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

 

 

另:

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

 

1.同步验证方式:

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

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

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

 

2.心跳验证方式:

每隔特定的时间进行一次验证,执行一个预定义的验证语句(sql语句),

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

可以根据具体情况,适当的调节验证间隔时间。

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

 

 

 

4.心得(非endual心得,转载来的)

自从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性能要求较高时,可以不进行验证。

分享到:
评论

相关推荐

    DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试代码

    本项目提供了对三种常用的Java数据库连接池——DBCP(BasicDataSource)、C3P0和Tomcat JDBC的性能及稳定性测试代码。下面将详细介绍这三个连接池的工作原理、特性以及如何进行性能测试。 1. **DBCP ...

    c3p0 jdbc dbcp tomcatjdbc 乐观锁 高并发测试 4000 以上

    为了更明确怎样开发出高并发程序,本人写了一个测试例子去体验下 C3P0 tomcatJdbc dbcp 他们的并发能力。采用乐观锁控制oracle数据并发访问。测试结果表明在 c3p0 和dbcp 都能执行完4800以下并发线程访问。c3p0 比较...

    基于DBCP/c3p0/Tomcat的数据库连接池的demo

    总结起来,数据库连接池是提高Web应用性能的关键技术,DBCP和c3p0是常用的两个实现,而Tomcat内置的数据源支持则为开发者提供了方便的集成途径。理解和熟练掌握这些知识,有助于构建高效、稳定的Java Web应用。

    c3p0需要的所有的jar包(完整)

    C3P0与Apache的DBCP、Tomcat的Tomcat-jdbc-pool等其他连接池相比,各有优势。C3P0在连接管理上更为精细,提供了更多的自定义配置选项,但在性能上可能略逊于某些现代连接池,如HikariCP。选择哪一种取决于具体的...

    DBCP连接池DBCP和C3P0配置

    ### DBCP与C3P0连接池配置详解 #### 一、DBCP与C3P0概述 在Java开发中,数据库连接池是提高应用性能的重要手段之一。通过复用预分配好的数据库连接资源,避免了频繁创建和销毁数据库连接所带来的性能开销。Apache ...

    JdBC的访问方式DBCP连接池和C3P0

    DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。C3P0访问数据库技术,方便快捷,牵扯到的jar包可去网上下载!

    c3p0 还有其他连接池

    c3p0提供了对JDBC数据库连接的池化管理,其主要功能包括: 1. **连接初始化**:c3p0允许配置初始连接数量,确保应用启动时就有一定数量的连接可供使用。 2. **连接获取与释放**:应用可以通过连接池获取和归还连接...

    JAVA数据库连接池(C3P0,Druid,JNDI ,DBCP,Proxool,BoneCP)

    它简单易用,但相比于C3P0和Druid,DBCP的性能和稳定性稍弱。尽管如此,由于其开源和轻量级的特性,DBCP仍被广泛应用于小型项目中。 5. Proxool: Proxool是一个轻量级的JDBC连接池,它的特点是支持多租户,即在一...

    JavaEE 使用Tomcat的自带DBCP管理数据源案例

    在JavaEE应用开发中,数据源(DataSource)是管理和连接数据库的关键...在实际项目中,可以根据需求进行配置调整,以达到最佳的性能和稳定性。同时,了解和掌握数据源的使用,对于理解和优化JavaEE应用的性能至关重要。

    常用数据库连接池 (DBCP、c3p0、Druid) 配置说明1

    本文主要探讨了三个常用的数据库连接池:DBCP、c3p0和Druid,以及它们的配置说明。 1. **DBCP(Apache Commons DBCP)** DBCP是Apache Commons项目的一部分,它依赖于Apache Commons Pool对象池机制来管理数据库...

    hibernate4.5 c3p0 依赖包

    8. **其他连接池选择**: 虽然c3p0是一个流行的选择,但还有其他的连接池实现,比如Apache的DBCP、Tomcat的Tomcat-jdbc-pool等。每个都有其特点和适用场景,开发者可以根据项目需求选择合适的连接池。 总结,...

    c3p0数据库连接池

    **c3p0数据库连接池详解** ...理解并掌握c3p0的配置和使用,对于优化数据库访问性能,提升系统稳定性具有重要意义。在实际应用中,需要根据具体场景进行细致的配置和持续的监控,以确保连接池的最佳运行状态。

    DBPoolDemo:jdbc 池,包含 C3P0、DBCP、Proxool、Druid、tomcat-jdbc

    本篇文章将详细讲解标题中提到的五种主流Java数据库连接池:C3P0、DBCP、Proxool、Druid以及tomcat-jdbc,并逐一分析它们的特点、使用方法以及优缺点。 1. **C3P0** C3P0是一个开源的JDBC连接池,它实现了数据源和...

    c3p0-0.9.5

    4. **事务支持**:c3p0支持JDBC事务管理,可以在连接池中配置事务隔离级别,为应用程序提供更灵活的事务处理能力。 5. **性能优化**:c3p0提供了一些高级特性,如延迟加载(LazilyInitializingDataSource)和并发...

    c3p0.jar jar包

    7. **性能优化**:c3p0提供了一些高级特性,如预热连接(pre-test connections)、空闲连接测试(idle test)和连接池分割(pool partitioning),以提升性能和可靠性。 8. **连接池的监控**:c3p0 提供了JMX(Java...

    c3p0连接池的jar包下载

    C3P0与DBCP、Tomcat JDBC Pool等其他连接池相比,有自己的特点和优势。C3P0在连接管理上更为精细,提供了更多的性能调优参数,如连接测试策略、连接超时控制等。但不同的连接池在不同场景下性能表现可能有所差异,...

    jdbc数据库连接池工程文件_e3p0

    除了`e3p0`,还有其他著名的数据库连接池实现,如`C3P0`、`HikariCP`和`Apache DBCP2`等。它们各有特点,开发者可以根据项目的具体需求选择合适的连接池实现。 总的来说,`JDBC数据库连接池`是Java开发中不可或缺的...

    c3p0所需jar包

    然而,对于大型企业级应用,可能更倾向于使用HikariCP或Apache Tomcat JDBC Pool,因为它们在性能上通常优于C3P0。 6. **C3P0常见问题及解决方案**: - 连接超时:可通过调整`maxIdleTime`参数解决。 - 连接泄漏...

Global site tag (gtag.js) - Google Analytics