`
Jason__Chen
  • 浏览: 14872 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

DBCP,C3P0,Proxool,BoneCP性能比较

    博客分类:
  • JAVA
阅读更多
1 c3p0、dbcp、proxool、BoneCP比较
1.1 测试环境:
操作系统:windows xp sp3
数据库:mysql 5.1
1.2 测试条件:
initialSize=30;
maxSize=200;
minSize=30;
其余参数为默认值;
1.3 测试代码:
利用JAVA代码模拟多线程对这三种数据库连接池进行测试,通过花费的时间判断效率
DBTest.java:
public class DBTest implements Runnable /*extends Thread*/ {
public long date1=0;
private static Proxool proxool;
public static int count = 0;
public static void main(String[] args) throws Exception {
//DBCP.init();
//C3P0.init();
//proxool = Proxool.getInstance();
BoneCPConn.init();
DBTest test = new DBTest();
test.startup();
}

public void startup() {
for (int i = 0; i <5; i++) {
Thread thread = new Thread(this);
thread.start();
}
}

public void run() {
if(date1==0)
{
date1 = System.currentTimeMillis();
System.out.println(date1);
}
for(int i=0 ; i<10 ; i++){
try {
//Connection conn = DBCP.getConnection();
// Connection conn = C3P0.getConnection();
//Connection conn =proxool.getConnection();
Connection conn = BoneCPConn.getConnection();
if (conn != null) {
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("select * from user where id=1");
while (rs.next()) {
String username = rs.getString(2);
System.out.println(username);
}
rs.close();
statement.close();
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
count++;
if(count==5)
{
long date2 = System.currentTimeMillis();
System.out.println(date2);
System.out.println("运行完毕!耗时为:" + (date2 - date1) + "ms");
}
}
}
4.3.1 模拟5个线程循环10次并发访问数据库
DBCP用时1181ms
C3P0用时860ms
Proxool用时1563ms
BoneCP用时31ms
4.3.2 模拟10个线程循环10次并发访问数据库
DBCP用时1188ms
C3P0用时953ms
Proxool用时1625ms
BoneCP用时63ms
4.3.3 模拟20个线程循环10次并发访问数据库
DBCP用时1204ms
C3P0用时1000ms
Proxool用时1640ms
BoneCP用时110ms
4.3.4 模拟30个线程循环10次并发访问数据库
DBCP用时1250ms
C3P0用时1047ms
Proxool用时1657ms
BoneCP用时156ms
4.3.5 模拟50个线程循环10次并发访问数据库
DBCP用时1406ms
C3P0用时1343ms
Proxool用时1843ms
BoneCP用时172ms
4.3.6 模拟100个线程循环10次并发访问数据库
DBCP用时1641ms
C3P0用时2703ms
Proxool用时2031ms
BoneCP用时532ms
4.3.7 模拟200个线程循环10次并发访问数据库
DBCP用时2093ms
C3P0用时4891ms
Proxool用时2406ms
BoneCP用时936ms
4.3.8 模拟500个线程循环10次并发访问数据库
DBCP用时3219ms
C3P0用时11703ms
Proxool用时3343ms
BoneCP用时1922ms
4.3.9 模拟800个线程循环10次并发访问数据库
DBCP用时4688ms
C3P0用时12063ms
Proxool用时4141ms
BoneCP用时2859ms
4.3.10 模拟1000个线程循环10次并发访问数据库
DBCP用时5187ms
C3P0用时12563ms
Proxool用时4703ms
BoneCP用时3610ms
4.3.11 模拟3000个线程循环10次并发访问数据库
DBCP用时14094ms
C3P0用时16297ms
Proxool用时11344ms
BoneCP用时11391ms
4.3.12 模拟5000个线程循环10次并发访问数据库
DBCP用时23610ms
C3P0用时22032ms
Proxool用时20125ms
BoneCP用时17125ms

4.4测试结果分析:
         BoneCP一直保持性能最佳
4.5 测试结论
          通过对四种数据库连接池的性能测试发现,BoneCP的性能明显优于其它三种.
分享到:
评论
30 楼 Jason__Chen 2010-10-25  
sw1982 写道
建议模拟一下mysql在20--50连接池大小小,2w记录的插入效率。
这个比较接近真实使用环境

呵呵,我已经把mysql的最大连接数设到了500了貌似,因为我的数据库连接池最大值有200,我担心如果连接数低于连接池最大值会引发错误,如果某个线程去取连接时,数据库连接池中的连接未达到最大值必然还会创建连接,而此时mysql的连接数已达到最大值必然会拒绝连接,此时可能会出错

后者,2w记录的插入,我测试的时候已经达到了5w数据的查询,虽然一个是查询,一个是插入,但这次研究的只是数据库连接池的性能,这些数据库操作要么都快要么都慢,只是将基数变大了
29 楼 Jason__Chen 2010-10-25  
psuqqvfp 写道
快不是主要的,关键是稳定,高并发时,会不会崩,这才是应该所关心的

JAVA虚拟机最多也就能模拟5000-7000个线程了,所以测试的时候最多才到5000
28 楼 Jason__Chen 2010-10-25  
smilerain 写道
http://code.google.com/p/jspxnet/downloads/list

包  jspx.net-3.6.jar
也有个连接池,麻烦也一起测试一下。

   JspxDataSource dataSource = new JspxDataSource();  
   dataSource.setDriverClass("驱动");  
   dataSource.setJdbcUrl("jdbc连接");  
   dataSource.setUser("用户名");  
   dataSource.setMaxPoolSize(10); //最大连接数  
   dataSource.setMaxConnectionTime(180000); //3 minute 分钟,单位为毫秒  
      
   Connection connection = dataSource.getConnection();  
   connection.createStatement();  
  
   connection.close();  

 
  <bean id="jspxDataSource" class="com.jspx.datasource.JspxDataSource" destroy="close" singleton="true">  
          <string name="driverClass">${driverClassName}</string>  
           <string name="jdbcUrl">${jdbcUrl}</string>  
          <string name="user">${username}</string>  
          <string name="password">${password}</string>  
          <int name="maxPoolSize">${maxPoolSize}</int>  
   </bean>  



模拟5个线程循环10次并发访问数据库:594ms
模拟10个线程循环10次并发访问数据库:594ms
模拟20个线程循环10次并发访问数据库:625ms
模拟30个线程循环10次并发访问数据库:672ms
模拟50个线程循环10次并发访问数据库:875ms
模拟100个线程循环10次并发访问数据库:1078ms
模拟200个线程循环10次并发访问数据库:1266ms
模拟500个线程循环10次并发访问数据库:2001ms
模拟800个线程循环10次并发访问数据库:2844ms
模拟1000个线程循环10次并发访问数据库:3220ms
模拟3000个线程循环10次并发访问数据库:9532ms
模拟5000个线程循环10次并发访问数据库:15987ms
27 楼 psuqqvfp 2010-10-24  
快不是主要的,关键是稳定,高并发时,会不会崩,这才是应该所关心的
26 楼 rustlingwind 2010-10-24  
srdrm 写道
性能不是核心问题

能够断线重连,失败恢复的连接池才更可靠



我也很关心自动重连的问题。尤其是生产环境下,启动n个应用服务器节点的情况,重启数据库后还要重启n个应用服务器节点简直太麻烦,而且,对于实时性要求较高的网站来说,也是不允许的。
而对于性能来说,这几种常见连接池的性能个人感觉不会差距太大,而且如果网站的性能有问题,一般性能瓶颈也绝不会是在数据库连接池上。

我想提一个问题就是,对于dbcp,c3p0等连接池来说,如果使用其自带的自动重连机制,势必导致每个数据库访问都要加上一次查询,这种机制对性能的影响也未免太大了吧?!肯定有更简单有效的实现方式,为何不提供呢?比如有一个守护线程,主动定期检查,或者被动收到到连接断开的异常信息后,便开始以一定的时间间隔自动重连数据库,这样对性能的开销影响最小。难道这种机制还需要自己实现?我知道 spy memcached 的自动重连机制就是这样的,但是为何这些数据库连接池的自动重连机制这么烂呢?求高手解惑!
25 楼 sw1982 2010-10-24  
建议模拟一下mysql在20--50连接池大小小,2w记录的插入效率。
这个比较接近真实使用环境
24 楼 bizsys 2010-10-24  
c3p0,我们一直在用它
23 楼 jcs7575 2010-10-23  
相比较来看 c3p0 还是很不错的

我们也正在计划从dbcp切换到c3p0

BoneCP 没用过 不知道
22 楼 liu_yi126 2010-10-23  
BoneCP对于事务上面处理的怎么样?
21 楼 pk3589 2010-10-23  
单单一个简单的不规则的查询 不能叫做性能测试
20 楼 srdrm 2010-10-23  
性能不是核心问题

能够断线重连,失败恢复的连接池才更可靠

19 楼 smilerain 2010-10-23  
每个个人测试的结果都不太一样  我测试的 proxool 在多线程搞并发下很差
c3p0很稳定
18 楼 fight_bird 2010-10-23  
项目中还是用久经考验的组件稳妥,DBCP用了很久很久,值得信赖。

BoneCP的性能优势应该比较靠谱,至少很明确的提出自己底层优势所在。

低并发下的性能优势太大了,存疑......
17 楼 kenshinlk 2010-10-23  
Jason__Chen 写道
kenshinlk 写道
请教一下楼主,对于Bonecp:
1.有没有类似proxool的监测后台,即用org.logicalcobwebs.proxool.admin.servlet.AdminServlet配置的监测后台

2.自动重连机制如何,即应用服务器和数据库服务器曾经短暂性断开过,proxool能够比较好的自动重连,bonecp应该如何配置呢(曾经尝试过,但貌似会抛错)?

别说请教啊,不敢当啊,大家交流交流
1,BoneCP没有监测后台,这4种连接池也就proxool有吧
2,还没去研究过这方面列,proxool是通过<property name="autoReconnect" value="true" />
去重连的?



<!--proxool 解决与数据库断开重连问题(houseKeepingTestSql为oracle的语法,其他数据库类似) -->
<property name="houseKeepingTestSql">
<value>select 1 from dual</value>
</property>
<property name="testBeforeUse">
<value>true</value>
</property>
<property name="testAfterUse">
  <value>true</value>
</property>
16 楼 wolf880805 2010-10-23  
总之 不要 用 c3p0 就好,
15 楼 siashuayongsheng 2010-10-22  
proxool 还有监控连接数目,这点挺爽
14 楼 fsroger 2010-10-22  
之前不是推出了个BoneCP 0.6.4b版本吗?那时候不是有讨论过吗?
不知道是否有改进了?
http://www.iteye.com/news/16703#comments
http://www.iteye.com/news/13635-bonecp-java-connection-pool?page=1#comments

还望多点测试看看,有没有问题。
暂时还是只相信dbcp,proxool
13 楼 caoyangx 2010-10-22  
BoneCP最近一直用,昨天还升级最新的,不过设计的还不是很合适,BoneCP采用长连接方式,一旦数据库故障或网络故障发生后,连接池就会失效,即使解决故障后也得重启web服务。这点不如DBCP。还有配置文件比较让人头晕,一大堆配置,有用的一个没有,比如defaultCommit,他默认是true,也没法改成false,这样的话有些嵌套事务就无法回滚,所以我下了他的源码手动修改后重新编译成jar。我都等了3个版本也不见作者修改这个问题。总体来说,还算可以,我没有做过测试。我不知道BoneCP比DBCP快多少,但是感官上是一样的。
12 楼 fuanyu 2010-10-22  
顶下楼主,的确是个好帖。
11 楼 smilerain 2010-10-22  
http://code.google.com/p/jspxnet/downloads/list

包  jspx.net-3.6.jar
也有个连接池,麻烦也一起测试一下。

   JspxDataSource dataSource = new JspxDataSource();  
   dataSource.setDriverClass("驱动");  
   dataSource.setJdbcUrl("jdbc连接");  
   dataSource.setUser("用户名");  
   dataSource.setMaxPoolSize(10); //最大连接数  
   dataSource.setMaxConnectionTime(180000); //3 minute 分钟,单位为毫秒  
      
   Connection connection = dataSource.getConnection();  
   connection.createStatement();  
  
   connection.close();  

 
  <bean id="jspxDataSource" class="com.jspx.datasource.JspxDataSource" destroy="close" singleton="true">  
          <string name="driverClass">${driverClassName}</string>  
           <string name="jdbcUrl">${jdbcUrl}</string>  
          <string name="user">${username}</string>  
          <string name="password">${password}</string>  
          <int name="maxPoolSize">${maxPoolSize}</int>  
   </bean>  

相关推荐

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    在Spring3中配置数据源,包括DBCP,C3P0,Proxool,Bonecp主要的数据源,里面包含这些数据源的jar文件和依赖文件及配置文件。。 如Bonecp目前听说是最快的数据源,速度是传统的c3p0的25倍, bonecp.properties文件: ...

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

    本文将详细介绍几个常见的Java数据库连接池实现:C3P0、Druid、JNDI、DBCP、Proxool以及BoneCP,并结合Spring+MyBatis+maven环境下的应用示例进行解析。 1. C3P0: C3P0是一个开源的JDBC连接池,它实现了数据源和...

    数据连接池用法(C3PO,proxool,dbcp,bonecp)

    本文将详细介绍四个常见的Java数据连接池组件——C3PO、Proxool、DBCP和BoneCP的配置与用法。 首先,我们来看C3PO(Comprehensive3rdPartyPooling),这是一个基于Apache Commons DBCP的数据库连接池实现,具有更好...

    druid-1.0.19

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模...

    druid-0.2.20

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模...

    druid-1.0.25

    Druid是阿里巴巴的开源产品,目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

    druid各版本jar包

    Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

    druid-1.1.12.jar

    Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

    Java连接池评估报告

    1. **性能考量**:在需要高性能和稳定性的应用中,推荐使用C3P0或BoneCP。 2. **易用性**:对于那些寻求易于集成和配置的解决方案,DBCP和Tomcat JDBC Pool可能是更好的选择。 3. **资源管理**:为了减少资源浪费并...

    druid-1.0.11.jar

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模...

    Druid数据库连接池Jar包

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署...

    关于JAVA的数据库连接池的探讨.pdf

    对于提供连接池的数据源来说,除了Apache的DBCP以外,还有C3P0、Proxool、BoneCP等。具体如表1所示。 表1 基于JAVA的带连接池的数据源组件 序号 数据源名称 依赖的JAR包 实现的功能 1 Apache DBCP dbcp.jar、pool....

    几种常用的Java数据源解决方案

    本文将详细介绍几种常用的数据源解决方案及其配置方法,包括JNDI方式创建`DataSource`、Apache提供的简单连接池创建数据源、C3P0方式创建数据源、Proxool方式创建数据源以及BoneCP方式创建数据源。 #### JNDI 方式...

    数据库连接池以及hibernate对各种连接池的整合

    10. **BoneCP**:快速且开源的连接池,比C3P0和DBCP快25倍,适合性能敏感的应用。 在配置Hibernate与连接池的整合时,需要注意以下几点: 1. **Apache DBCP**:在Hibernate 2中支持,但在Hibernate 3中不推荐,...

    几种数据库连接池详细配置

    本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P0、Proxool、BoneCP的详细配置参数,帮助开发者更好地理解和应用这些技术。 ### Apache DBCP **dataSource**: 配置数据源,通常在应用服务器的配置文件...

    软件性能优化最佳实践

    不同的连接池(如c3p0、dbcp、Proxool等)在性能和稳定性方面有所不同。例如,BoneCP在性能方面表现出色,而DBCP则更稳定。 - **批量数据处理:** 针对大批量数据处理任务,建议直接使用JDBC,以获得更好的性能。 *...

    Java-ConnectionPools.rar_连接池

    2. **c3p0**:这是一个开源的JDBC连接池,由Maurice Priester创建。c3p0提供了连接测试、空闲连接检查等功能,同时支持JNDI集成。它允许开发者配置各种参数,如最小和最大连接数、初始连接数量、超时时间等。 3. **...

    基于SSM架构实现的大型分布式购物网站-B2C项目源码+项目说明.zip

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。 Druid已经在阿里巴巴部署了超过600个应用,经过多年多生产环境大规模...

Global site tag (gtag.js) - Google Analytics