这个测试的目的是验证当前常用数据库连接池的性能。

testcase

  1. Connection conn = dataSource.getConnection();
  2. PreparedStatement stmt = conn.preparedStatement("select 1");
  3. ResultSet rs = stmt.executeQuery();
  4. while (rs.next()) {
  5. }
  6. rs.close();
  7. stmt.close();
  8. conn.close();
propertyvalue
initialSize10
minPoolSize10
maxPoolSize50

测试各种并发场景下执行申请1,000,000(一百万)次总耗时的性能对比。

环境

  • OS linux 3.5.0-19-generic X86_64
  • CPU XEON E5-2450 双路共16核32物理线程
  • Memory 48G
    这是一台双路至强CPU的工作站,比我之前在mac book pro上做的测试,更接近真实服务器的运行环境。

JDK 1.6.0_38

数据库连接池1 thread2 threads5 threads10 threads20 threads50 threads100 threads
druid2487101,1331,1349051,1071,468
dbcp6601,5223,5454,1763,6714,23714,129
boneCP3,5222,9302,5793,7457,43411,99114,584
c3p04,2759,5093,37110,43913,47219,84836,153
proxool7,1877,70711,03710,77715,222(Error)18,100(Error)21,547(Error)
tomcat-jdbc3727361,8791,7271,5761,32212,545
jboss-datasource1,3261,1842,9283,7653,0993,27810,812

JDK 1.7.0_10

数据库连接池1 thread2 threads5 threads10 threads20 threads50 threads100 threads
druid3096051,0289479628971,238
dbcp9241,4614,0624,0304,9085,50514,517
boneCP3,0472,0552,5493,8216,36712,86518,832
c3p04,0188,2068,89710,66712,36725,82238,681
proxool69124,7144,85111,90816,066(Error)19,568(Error)18,036(Error)
tomcat-jdbc4007401,8111,7071,6181,62411,905
jboss-datasource1,3691,1054,0023,0893,4833,66511,782

结果分析

  • Druid是性能最好的数据库连接池,tomcat-jdbc和druid性能接近。
  • proxool在激烈并发时会抛异常,完全不靠谱。在并发10的情况下,会使用11或者12个物理连接。
  • c3p0和proxool都相当慢,慢到影响sql执行效率的地步。
  • bonecp性能并不优越,采用LinkedTransferQueue并没有能够获得性能提升。
  • jboss-datasource虽然稳定,但是性能很糟糕
  • boneCP和c3p0完全不遵循minPoolSize的配置,只要有活动请求,就会用到maxPoolSize。
  • bonecp和c3p0存在较大并发时使用的物理连接超过maxPoolSize数量,达到maxPoolSize+1