论坛首页 Java企业应用论坛

使用DBCP 数据库连接池遇到的两个比较怀疑的问题

浏览 15936 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-25  
nmvr2600 写道
Mysql用的不多,不过dbcp现在的表现还好,说dbcp不行是几年前的情况,现在反倒是c3p0缺少维护了。

你这个测试代码是单线程的吧? 体现不了池的优势,其实你最多只能用一个connection。你个maxActive设成多大都没用。

你这个时间把初始化连接池的时间也算在里面了。这个还是小问题,关键是那个测试代码里每次做一次就把connection close了,你每次都close你还是要池干吗? 这不还是每次都要新建connection? connection创建非常昂贵。

另外对于dbcp,在高并发下maxIdle一定不能小于maxActive。

检测连接dbcp一样可以做。文档里有。

另外考虑batch insert。


我以前还真测了C3P0,像刚才上面提到的Case,出现过不少异常,我不知道是我的代码原因还是其它。
总之对比DBCP,DBCP的代码目前至少没有异常,没有报错.(一家之言,仅仅是我的代码示例).

对的,之前的是单线程,因为单线程跑通了,才能移到多线程环境下去测试。如果单线程就有问题,那么多线程的情况下就更不能保证了。现在我贴上的例子就是从线程池中启动的线程来测试的。

另外,解释一下,Connectin对象的获取,以下是获取一个Connection的代码.
public Connection getConnection() {
		Connection connection = null;
		try {
			connection = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}


看这个API上面有一段话
http://commons.apache.org/dbcp/apidocs/index.html

Overview in Dialog Form 
Q: How do I use the DBCP package? 

A: There are two primary ways to access the DBCP pool, as a Driver, or as a DataSource. You'll want to create an instance of PoolingDriver or PoolingDataSource. When using one of these interfaces, [color=red]you can just use your JDBC objects the way you normally would. Closing a Connection will simply return it to its pool. [/color]


我的这个示例也是使用到其中的某些对象,所以他们的方法行为应该都是一致的,所以.Closing a Connection = return connection to its pool.

虽然我没有看源代码,但可以确定此close方法通过代理方式完成的并不是真正的关闭数据库连接,而是返回到连接池中.

并且我上面的回复中也提到了一点. 当我开启30个连接对象在连接池中,当数据库数据操作完成.在 MySQL-> showprocesslist中,仍旧可以看到这30个连接仍然存在,只不过它们的状态从之前的Query或者其它转变成了sleep休眠状态.

所从DBCP API和实际观察,不会出现你说的这个关闭问题. 实在不行,最后只能看源代码了,呵呵.
0 请登录后投票
论坛首页 Java企业应用版

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