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

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

 

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 10002511328863445815.00 1328863446066.00 2510.0251
2521328863466569.00 1328863466821.00
2511328863477174.00 1328863477425.00
2541328863487555.00 1328863487809.00
2471328863499474.00 1328863499721.00
C3P0 10 10007811328863372064.00 1328863372845.00 802.80.08028
7891328863385489.00 1328863386278.00
8791328863401335.00 1328863402214.00
7731328863413608.00 1328863414381.00
7921328863424693.00 1328863425485.00
TomcatJDBC 10 10001911328863272642.00 1328863272833.00 191.80.01918
1971328863303126.00 1328863303323.00
1871328863313262.00 1328863313449.00
1951328863324253.00 1328863324448.00
1891328863334700.00 1328863334889.00

 

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 100 10007861328862922748.00 1328862923534.00 810.40.008104
8531328862939832.00 1328862940685.00
8101328862955354.00 1328862956164.00
8071328862981344.00 1328862982151.00
7961328862994825.00 1328862995621.00
C3P0 100 100025171328863021884.00 1328863024401.00 2248.80.022488
23401328863040949.00 1328863043289.00
19681328863075044.00 1328863077012.00
22561328863092216.00 1328863094472.00
21631328863114138.00 1328863116301.00
TomcatJDBC 100 10007521328863155803.00 1328863156555.00 7260.00726
7251328863171617.00 1328863172342.00
6941328863183983.00 1328863184677.00
7031328863195628.00 1328863196331.00
7561328863209798.00 1328863210554.00

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 150 100019191328861533609.00 1328861535528.00 1854.40.012363
19571328861551638.00 1328861553595.00
18691328861746964.00 1328861748833.00
19161328861791533.00 1328861793449.00
16111328861832003.00 1328861833614.00
C3P0 150 100027261328861869415.00 1328861872141.00 2990.80.019939
25701328861895349.00 1328861897919.00
33421328861912351.00 1328861915693.00
32181328861929664.00 1328861932882.00
30981328861950163.00 1328861953261.00
TomcatJDBC 150 10008771328861974599.00 1328861975476.00 8610.00574
8211328861990969.00 1328861991790.00
8901328862016507.00 1328862017397.00
8571328862037077.00 1328862037934.00
8601328862052490.00 1328862053350.00

 

 

DB POOL 线程
数量
单线程
执行次数
消耗时间
(ms)
开始时间
(ms)
结束时间
(ms)
平均消耗
时间(ms)
平均单条
时间(ms)
DBCP 300 100039081328862516139.00 1328862520047.00 3851.80.012839
38501328862408362.00 1328862412212.00
39391328862440877.00 1328862444816.00
38061328862469116.00 1328862472922.00
37561328862495883.00 1328862499639.00
C3P0 300 10006111 1328862711585.00 1328862717696.00 6233.20.020777
51621328862618669.00 1328862623831.00
62611328862638870.00 1328862645131.00
68321328862659598.00 1328862666430.00
68001328862681808.00 1328862688608.00
TomcatJDBC 300 100034581328862152316.00 1328862155774.00 3403.80.011346
33761328862308211.00 1328862311587.00
33971328862227685.00 1328862231082.00
33421328862261681.00 1328862265023.00
34461328862358400.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.心得

自从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


补充,刚看到的druidDatasource 测试

Changes (30)

View Page History
h1. 测试运行注意事项
添加 -server参数

h1. 场景一
单线程测试,连续执行100万次,对比时间、YungGC、FullGC的情况。这个场景用于测试非激烈竞争的情况下的性能差别。

h3. 测试代码
svn : http://code.alibabatech.com/svn/druid/trunk/src/test/java/com/alibaba/druid/pool/benckmark/Case0.java

h3. 测试结果
连续执行1000,000次,Druid和DBCP的测试对比结果:
||连接池   || 时间(毫秒) || YungGC || FullGC ||
| Druid      | 277 221          | 16 6           | 0            |
| DBCP     | 1,647 1,606   | 70             |0             |
| BoneCP | 762                 | 4                |0             |

h3. 测试代码 结论
{code} Druid和DBCP执行时间相差大约6倍,YungGC相差4倍多,FullGC都没有。由此看来,DruidDataSource在执行时间远胜于DBCP,而且产生的小对象比DBCP小得多。
public class Case0 extends TestCase {

private String jdbcUrl;
private String user;
private String password;
private String driverClass;
private int initialSize = 10;
private int minPoolSize = 1;
private int maxPoolSize = 2;
private int maxActive = 2;

protected void setUp() throws Exception {
jdbcUrl = "jdbc:fake:dragoon_v25masterdb";
user = "dragoon25";
password = "dragoon25";
driverClass = "com.alibaba.druid.mock.MockDriver";
}

h1. 场景二
多个线程,连续打开关闭连接1000,000次。

public void test_0() throws Exception {
DruidDataSource dataSource = new DruidDataSource();
h3. 测试代码
http://code.alibabatech.com/svn/druid/trunk/src/test/java/com/alibaba/druid/pool/benckmark/Case1.java

h3. 测试结果
连续执行1000,000次,Druid和DBCP的测试对比结果:
||连接池||线程数量 ||时间(毫秒) || YungGC || FullGC ||
| Druid |2 |1,177 | 34 | 0 dataSource.setInitialSize(initialSize); |
| DBCP |2 |2,738 | 139 |0|
| BoneCP |2 |2,242 | 8 |0|
| Druid |5 |3,7027 | 80 | 0 dataSource.setMaxActive(maxActive); |
| DBCP |5 |39,203 | 350 |0|
| Druid |10 |11,172 | 162 | 0 dataSource.setMinIdle(minPoolSize); |
| DBCP |10 |79,220 | 702 |0|
| Druid |20 |38,817 | 328 | 0 dataSource.setMaxIdle(maxPoolSize); |
dataSource.setPoolPreparedStatements(true);
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(jdbcUrl);
dataSource.setPoolPreparedStatements(true);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(true);
| DBCP |20 |159,966 | 1402 |0|

for (int i = 0; i < 10; ++i) {
p0(dataSource, "druid");
}
System.out.println();
}
h3. 结论
2个线程时,这时候时候激烈的并发获取连接,Druid和DBCP的执行时间差距缩小了,不到3倍。
public void test_1() throws Exception {
final BasicDataSource dataSource = new BasicDataSource();
5个线程时,获取连接的线程超过了maxActive(数量为2),DBCP性能急剧下降,Druid和DBCP的执行时间差距达到了13倍。
dataSource.setInitialSize(initialSize);
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(minPoolSize);
dataSource.setMaxIdle(maxPoolSize);
dataSource.setPoolPreparedStatements(true);
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(jdbcUrl);
dataSource.setPoolPreparedStatements(true);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(true);
10个线程时,Druid和DBCP的执行时间差距拉近为7倍。
for (int i = 0; i < 10; ++i) {
p0(dataSource, "dbcp");
}
System.out.println();
}

private void p0(DataSource dataSource, String name) throws SQLException {
long startMillis = System.currentTimeMillis();
long startYGC = TestUtil.getYoungGC();
long startFullGC = TestUtil.getFullGC();

final int COUNT = 1000 * 1000;
for (int i = 0; i < COUNT; ++i) {
Connection conn = dataSource.getConnection();
conn.close();
}
long millis = System.currentTimeMillis() - startMillis;
long ygc = TestUtil.getYoungGC() - startYGC;
long fullGC = TestUtil.getFullGC() - startFullGC;

System.out.println(name + " millis : " + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC);
}
}

{code}


参考:

java连接池性能测试报告:http://duzc2.iteye.com/blog/1536205

验证当前常用数据库连接池的性能:https://github.com/alibaba/druid/wiki/linux-benchmark

Apache common-pool, common-dbcp源码解读与对象池原理剖析:http://macrochen.iteye.com/blog/320077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C3P0 和 DBCP 都是连接池技术,可以有效地管理数据库连接,减少连接建立和释放的消耗。Druid 技术比 C3P0 和 DBCP 更加先进,它具有更高的性能和安全性,并且支持对数据库的实时监控和统计分析。 ### 回答2: c3p0,DBCP,和Druid都是Java中常用的数据库连接池技术,它们各自有不同的技术侧重和优势。 c3p0连接池是一个开源的JDBC连接池,侧重于提供高性能和可靠的连接池管理。其优势包括: 1. 可以自动缓存和重用数据库连接,避免频繁创建和销毁连接,提高了数据库访问的性能。 2. 提供连接断线自动恢复功能,能够检测并处理数据库连接的断开和超时问题,保证系统的稳定性。 3. 支持连接池的配置和监控,可以通过配置文件或者代码动态调整连接池的参数,满足不同业务需求。 4. 能够处理不同数据库的连接,支持主流数据库如MySQL、Oracle等。 DBCP连接池是Apache Commons项目中的一个模块,侧重于提供简单易用的连接池实现。其优势包括: 1. 配置简单,可以通过简单的配置文件即可完成连接池的创建和管理。 2. 轻量级,与应用程序集成方便,对代码的侵入性较小。 3. 支持基本的连接池功能,如连接的管理、复用和释放。 4. 良好的可扩展性,可以通过集成其他组件来实现更高级的功能。 Druid连接池是阿里巴巴开源的一款高性能、可扩展和功能丰富的数据库连接池,侧重于提供全方位的数据库连接管理。其优势包括: 1. 提供性能监控和统计功能,可以实时监控数据库连接池的状态和性能指标,方便线上问题的排查和性能优化。 2. 支持连接池的防火墙功能,可以通过配置白名单、黑名单等规则来过滤恶意或异常的数据库连接。 3. 内置了SQL防注入功能,能够自动检测和阻止恶意SQL注入攻击。 4. 提供了数据库连接的可视化接口,方便开发人员查看和管理连接池的状态和连接使用情况。 总的来说,c3p0、DBCP和Druid都是成熟、稳定的数据库连接池技术,根据实际需求和性能要求选择合适的连接池可以提升应用的数据库访问性能稳定性。 ### 回答3: c3p0,DBCP和Druid都是常用的数据库连接池技术,它们都有各自的侧重和优势。 c3p0是一种快速而可靠的JDBC连接池,侧重于提供高性能的连接缓存和连接池管理。它可以对JDBC连接进行管理和重用,有效地降低了数据库连接的创建和关闭的消耗。同时,c3p0还支持连接池的配置,可以根据应用的负载情况进行自动调整,保证连接池的稳定性DBCP(数据库连接池)也是一种常用的连接池技术,它侧重于提供简单易用的连接池解决方案。DBCP提供了基本的连接池功能,并且可以通过配置文件进行定制。它的优势在于使用简单,不需要过多的配置和调整,适用于一些简单的应用场景。 Druid是阿里巴巴开源的数据库连接池,侧重于提供高性能和可扩展性。它支持了连接池的所有功能,同时还提供了一些监控和统计功能,可以方便地监控和定位问题。Druid还内置了SQL防火墙和统计功能,可以有效地防止SQL注入攻击和性能问题。 总的来说,c3p0,DBCP和Druid都是优秀的连接池技术,具有各自的特点和优势。根据应用的需求和场景,可以选择合适的连接池技术来提高数据库访问的性能稳定性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值