论坛首页 Java企业应用论坛

java项目开发实践经验之二:几种常见数据库连接池的使用比较

浏览 17515 次
精华帖 (3) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (9)
作者 正文
   发表时间:2010-08-02   最后修改:2010-08-02
unika_ly12 写道
引用
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

请问dbcp的版本是?大并发量是指多大?


针对dbcp,我在oracle 10上做了下测试:
环境配置:
最大连接数设置为10
初始连接数位2
持久层框架 bboss-persistent,连接池common-dbcp 1.3

测试场景:
300个线程并发往一张3字段的表中插入数据,每个线程执行3条记录插入操作

测试结果:
插入完毕后,统计结果如下
不使用事务 :357条/秒
使用RW_TRANSACTION事务:820条/秒

测试程序:
package com.frameworkset.common.poolman;

import javax.transaction.RollbackException;

import com.frameworkset.orm.transaction.TransactionManager;

/**
 * 
 * <p>Title: CurrentTest.java</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 * @Date 2009-7-2 下午12:02:44
 * @author biaoping.yin
 * @version 1.0
 */
public class CurrentTest {
	public static void main(String[] args) throws InterruptedException {

//		for(int j = 0; j < 300; j ++)
//		{
//			CurrentTest i = new CurrentTest();
//			i.test(false);
//		}
		
		for(int j = 0; j < 300; j ++)
		{
			CurrentTest i = new CurrentTest();
			i.test(true);
		}

	}
	
	public void test(boolean usetx)
	{
		if(!usetx)
		{
			Task t = new Task();
			t.start();
		}
		else
		{
			TXTask t = new TXTask();
			t.start();
		}
			
	}
	static class Task extends Thread
	{

		/* (non-Javadoc)
		 * @see java.lang.Thread#run()
		 */
		@Override
		public void run() {
			DBUtil db = new DBUtil();
		
			try {

				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");

			} catch (Exception e) {

				e.printStackTrace();
			}
			
		}
		
	}
	
	static class TXTask extends Thread
	{

		/* (non-Javadoc)
		 * @see java.lang.Thread#run()
		 */
		@Override
		public void run() {
			DBUtil db = new DBUtil();
			TransactionManager tm = new TransactionManager();
			try {
				tm.begin(tm.RW_TRANSACTION);
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				
				db.executeInsert("insert into TEST_CURRENT(id,name) values(10,'test')");
				tm.commit();
			} catch (Exception e) {
				try {
					tm.rollback();
				} catch (RollbackException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				e.printStackTrace();
			}
			
		}
		
	}
}


测试用例可在附件中下载,bbossgroups最新版本的下载地址:
http://sourceforge.net/projects/bboss/files/bbossgroups-2.0-RC/bbossgroups-2.0-RC.zip/download


注意同时要打两个补丁,补丁地址:
http://sourceforge.net/projects/bboss/files/bbossgroups-2.0-RC/bboss%20rpc%20classcast%20and%20timeout%20exception%20patch.zip/download

http://sourceforge.net/projects/bboss/files/bbossgroups-2.0-RC/cglib%20stackoverflow-patch.zip/download






0 请登录后投票
   发表时间:2010-08-02  
jdbc2 中,明确的提出连接池,而且要求各个数据库厂商实现,为什么不用驱动程序自带的连接池?

有比这个更好的吗?

你说的那个什么websphere , weblogic 的连接池, 其实都是数据库厂商提供的。 只是做个界面方便你配置而已。
0 请登录后投票
   发表时间:2010-08-03  
楼主:
请问使用的是什么数据库比较出结论?
c3P0 速度确实比Proxool 快,  项目用下来,我认为C3P0稳定性 不如Proxool ;   c3p0 有时候connection并没有被关闭,会出现DEADLOCK 问题



一 开源数据连接池
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

2 c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
          此外不提供连接池监控。
         
3 proxool
proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:proxool.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
在另外2个开源连接池中成功结束,但在proxool中出现异常退出。

0 请登录后投票
   发表时间:2010-08-03  
使用连接池确实比较方便, 针对mysql还可以防止掉线 ..
0 请登录后投票
   发表时间:2010-08-06  
针对大家提出的问题,我谈一下自己的看法

问题一 比较的这些连接池的依据,为什么我的应用使用情况和你说的不一样?
其实连接池是否稳定首先和应用代码有直接关联,代码有问题再好的连接池也不灵。抛开代码问题,那么我的判断都是基于已有的数个项目的使用情况而做出,肯定算不上权威数据,只是个人经验,但相信也是有一定价值的。这些项目基本上属于中小型项目,用户量1万左右,并发数大概在几百,数据量从100万到1亿不等。
问题二 比较的连接池基于什么环境
在笔者对连接池进行比较所参考的几个项目中,涵盖了大部分的数据库环境,主要包括aix和linux下的oracle、db2环境,windows下的sqlserver环境,以及linux下的mysql、informix环境
问题三 连接池这个东西只是厂商提供方便配置而已
当然是厂商自己针对jdbc驱动包进行进一步包装形成的,但就是这个包装,关系到了我们应用的稳定性以及可控性。毕竟复杂一些的应用里基本上都要使用到连接池,因此连接池的性能我们也是很关心的。另外连接池的监控能够帮助我们排除很多程序上的性能bug,这一点也是很有用的。

广告时间: 轻松阅读、快乐享受,尽在“阅读地带”www.article-reading.com
0 请登录后投票
   发表时间:2010-08-06  
这确实是C3P0里常见的issue.解决方案是配置一个参数 unreturnedConnectionTimeout,单位是秒。
虽然丑陋了些,但是好歹能解决问题。

waterborn 写道
楼主:
请问使用的是什么数据库比较出结论?
c3P0 速度确实比Proxool 快,  项目用下来,我认为C3P0稳定性 不如Proxool ;   c3p0 有时候connection并没有被关闭,会出现DEADLOCK 问题



一 开源数据连接池
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

2 c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
          此外不提供连接池监控。
         
3 proxool
proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:proxool.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
在另外2个开源连接池中成功结束,但在proxool中出现异常退出。

0 请登录后投票
   发表时间:2010-08-06  
公司一直用的proxool
0 请登录后投票
   发表时间:2010-08-06  
unika_ly12 写道
引用
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

请问dbcp的版本是?大并发量是指多大?

 

关注学习~~~~

0 请登录后投票
   发表时间:2010-11-12  
这些连接池都有用过,不过有个问题很奇怪就是在本地测试时没有问题,不过将网站发布上网上空间就不行,似乎现在网上的的服务器都不支持连接池的功能哦~~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics