可用于Java / JDBC的最佳连接池是什么?
我正在考虑2个主要候选人(免费/开源):
- Apache DBCP- http://commons.apache.org/dbcp/
- C3P0- http://sourceforge.net/projects/c3p0
我已经在博客和其他论坛上阅读了很多有关它们的内容,但无法做出决定。
这两个有其他相关选择吗?
可用于Java / JDBC的最佳连接池是什么?
我正在考虑2个主要候选人(免费/开源):
我已经在博客和其他论坛上阅读了很多有关它们的内容,但无法做出决定。
这两个有其他相关选择吗?
Answers:
DBCP已过时,而不是生产级。不久前,我们对这两者进行了内部分析,创建了一个测试夹具,生成了针对这两者的负载和并发性,以评估它们在现实生活条件下的适用性。
DBCP始终在我们的测试应用程序中生成异常,并努力达到C3P0能够无任何异常处理的性能水平。
C3P0还可以稳健地处理数据库断开连接和恢复时的透明重新连接,而如果从其下方拔出了链接,则DBCP永远不会恢复连接。更糟糕的是,DBCP正在将Connection对象返回到基础传输中断的应用程序。
从那时起,我们已经在4个主要的重负荷消费者Web应用程序中使用了C3P0,并且从未回过头。
更新:事实证明,经过多年搁置,Apache Commons员工使DBCP脱离了休眠状态,现在它又是一个积极开发的项目。因此,我的原始帖子可能已过时。
话虽这么说,我还没有体验过这个新升级的库的性能,也没有听说过它在任何最新的应用程序框架中都是事实。
我邀请您试用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
在生产中已经使用DBCP已有两年了。它很稳定,可以在DB服务器重新启动后幸存下来。只需正确配置即可。它只需要指定几个参数,所以不要偷懒。这是我们的系统生产代码的片段,其中列出了我们明确设置以使其起作用的参数:
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");
以下是一些文章,显示DBCP的性能明显高于C3P0或Proxool。同样以我自己的经验,c3p0确实具有一些不错的功能,例如预准备语句池,并且比DBCP更具可配置性,但是在我使用过DB3的任何环境中,DBCP显然都更快。
dbcp和c3p0之间的区别?绝对没有!(Sakai开发人员博客)
http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html
另请参阅博客文章的注释中与JavaTech文章“ Connection Pool Showdown”类似的内容。
如果配置正确,Dbcp即可投入生产。
例如,它在每天访问量为350000的商业网站上使用,并具有200个连接池。
只要您正确配置它,它就可以很好地处理超时。
由于已经解决了许多生产问题,因此版本2正在进行中,并且具有使其可靠的背景。
我们将其用于批处理服务器解决方案,并且已经运行了数百个批处理,这些批处理可在数据库中的数百万行上运行。
tomcat jdbc池运行的性能测试表明,它比cp30具有更好的性能。
一个易于使用的好选择是DBPool。
“基于Java的数据库连接池实用程序,支持基于时间的到期,语句缓存,连接验证以及使用池管理器的轻松配置。”
我们遇到了一个需要引入连接池的情况,我们面前有4个选择。
我们根据我们的标准进行了一些测试和比较,决定选择HikariCP。阅读这篇文章,解释为什么我们选择HikariCP。
要以最佳方式实现C3P0,请检查此答案
C3P0:
对于企业应用程序,C3P0是最佳方法。C3P0是一个易于使用的库,用于通过JNDI可绑定的数据源(包括实现连接和语句池的数据源)扩展传统的(基于DriverManager的)JDBC驱动程序,如jdbc3规范和jdbc2 std扩展所述。C3P0还可以稳健地处理数据库断开连接和恢复时的透明重新连接,而如果从其下方拔出了链接,则DBCP永远不会恢复连接。
因此,这就是c3p0和其他连接池还准备了语句高速缓存的原因-它允许应用程序代码避免处理所有这些问题。语句通常保存在一些有限的LRU池中,因此常见语句重用了PreparedStatement实例。
更糟糕的是,DBCP正在将Connection对象返回到基础传输中断的应用程序。c3p0的一个常见用例是替换Apache Tomcat附带的标准DBCP连接池。通常,程序员会遇到这样的情况,即连接未在DBCP连接池中正确回收,并且在这种情况下c3p0是有价值的替代方法。
在当前更新中,C3P0具有一些出色的功能。那些被给予以下:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();
此处,最大和最小池大小定义了连接范围,这意味着此应用程序将采用的最小和最大连接数。MaxIdleTime()
定义何时释放空闲连接。
DBCP:
这种方法也不错,但是有一些缺点,例如连接超时和连接重新实现。当我们使用多线程项目时,C3P0很好。在我们的项目中,通过使用DBCP同时使用了多个线程执行,然后,如果使用更多的线程执行,则连接超时。因此,我们进行了c3p0配置。我根本不建议使用DBCP,尤其是当数据库消失时,它会把连接从池中抛出,如果DB回来时它无法重新连接,并且无法将连接对象动态地添加回池中(这种情况会永远挂在这里)。 JDBCconnect I / O套接字读取后)
谢谢 :)