Dem*_*ema 311 java connection-pooling jdbc c3p0 apache-commons-dbcp
什么是可用于Java/JDBC的最佳连接池库?
我正在考虑2个主要候选人(免费/开源):
我在博客和其他论坛上阅读了很多关于它们的内容,但无法做出决定.
这两个是否有任何相关的替代方案?
j p*_*mel 179
DBCP已过期而非生产等级.一段时间后,我们对两者进行了内部分析,创建了一个测试夹具,对两者产生负载和并发性,以评估它们在现实生活条件下的适用性.
DBCP始终如一地在我们的测试应用程序中生成异常,并努力达到C3P0能够处理的性能水平,没有任何例外.
C3P0还可以在恢复时稳健地处理数据库断开连接和透明重新连接,而如果链接从其下方取出,则DBCP永远不会恢复连接.更糟糕的是DBCP将Connection对象返回到底层传输已经破坏的应用程序.
从那时起,我们在4个主要的重载消费者网络应用程序中使用了C3P0,并且从未回头.
更新:事实证明,经过多年坐在架子上,Apache Commons民众已经让DBCP摆脱了休眠状态,现在又是一个积极开发的项目.因此我原来的帖子可能已经过时了.
话虽如此,我还没有体验过这个新升级的库的性能,也没有听说它在任何最近的应用程序框架中都是事实上的.
wwa*_*dge 176
我邀请您试用BoneCP - 它是免费的,开源的,并且比可用的替代品更快(参见基准测试部分).
免责声明:我是作者所以你可以说我有偏见:-)
更新:截至2010年3月,仍然比新重写的Apache DBCP("tomcat jdbc")池快35%左右.请参阅基准测试部分中的动态基准链
更新#2:(2013年12月)经过4年的顶峰,现在有一个更快的竞争对手:https://github.com/brettwooldridge/HikariCP
更新#3:(2014年 9月)此时请考虑弃用 BoneCP ,建议切换到HikariCP.
更新#4:(2015年4月) - 我不再拥有域名jolbox.com,但新所有者保留了旧内容,所以要小心.
小智 14
对于DBCP的自动重新连接问题,有没有试过使用以下2个配置参数?
validationQuery="Some Query"
testOnBorrow=true
Run Code Online (Sandbox Code Playgroud)
oᴉɹ*_*ǝɥɔ 12
现在已经在生产中使用DBCP几年了.它是稳定的,幸存数据库服务器重启.只需正确配置它.它只需要指定一些参数,所以不要太懒惰.以下是我们的系统生产代码的片段,其中列出了我们明确设置的参数以使其工作:
DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));
driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));
SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");
Run Code Online (Sandbox Code Playgroud)
小智 8
以下是一些文章,表明DBCP的性能远远高于C3P0或Proxool.另外根据我自己的经验,c3p0确实有一些很好的功能,比如预处理语句池,比DBCP更可配置,但DBCP在我使用它的任何环境中都明显更快.
dbcp和c3p0之间的区别?绝对没有!(Sakai开发者博客)
http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html
另请参阅博客文章评论中的JavaTech文章"连接池摊牌".
小智 7
不幸的是他们都已经过时了.DBCP最近有所更新,另外两个是2-3岁,有许多突出的bug.
如果配置正确,Dbcp已准备就绪.
例如,它在商业网站上使用,每天350000访客,并且有200个连接池.
如果您正确配置它,它可以很好地处理超时.
版本2正在进行中,它具有使其可靠的背景,因为已经解决了许多生产问题.
我们将它用于我们的批处理服务器解决方案,它已经运行了数百个批次,可以在数据库中处理数百万行.
由tomcat jdbc pool运行的性能测试表明它具有比cp30更好的性能.
| 归档时间: |
|
| 查看次数: |
196420 次 |
| 最近记录: |