精华帖 (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和实际观察,不会出现你说的这个关闭问题. 实在不行,最后只能看源代码了,呵呵. |
|
返回顶楼 | |