300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0

java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0

时间:2019-02-25 21:35:25

相关推荐

java连接池域名切换_java  - 使用JDBC的连接池选项:DBCP与C3P0

java - 使用JDBC的连接池选项:DBCP与C3P0

什么是可用于Java / JDBC的最佳连接池库?

我正在考虑2个主要候选人(免费/开源):

Apache DBCP - [/dbcp/]

C3P0 - [/projects/c3p0]

我在博客和其他论坛上阅读了很多关于它们的内容,但无法做出决定。

这两个是否有任何相关的替代方案?

15个解决方案

174 votes

DBCP已过期而非生产等级。 一段时间后,我们对两者进行了内部分析,创建了一个测试夹具,对两者产生负载和并发性,以评估它们在现实生活条件下的适用性。

DBCP始终如一地在我们的测试应用程序中生成异常,并努力达到C3P0能够处理的性能水平,没有任何例外。

C3P0还可以在恢复时稳健地处理数据库断开连接和透明重新连接,而如果链接从其下方取出,则DBCP永远不会恢复连接。 更糟糕的是DBCP将Connection对象返回到底层传输已经破坏的应用程序。

从那时起,我们在4个主要的重载消费者网络应用程序中使用了C3P0,并且从未回头。

更新:事实证明,经过多年坐在架子上,Apache Commons民众已经让DBCP摆脱了休眠状态,现在又是一个积极开发的项目。 因此我原来的帖子可能已经过时了。

话虽如此,我还没有体验过这个新升级的库的性能,也没有听说它在任何最近的应用程序框架中都是事实上的。

j pimmel answered -02-11T04:22:37Z

168 votes

我邀请您试用BoneCP - 它是免费的,开源的,并且比可用的替代品更快(参见基准测试部分)。

免责声明:我是作者所以你可以说我有偏见:-)

更新:截至3月,仍然比新重写的Apache DBCP(“tomcat jdbc”)池快35%左右。 请参阅基准测试部分中的动态基准链

更新#2:(12月)经过4年的顶峰,现在有一个更快的竞争对手:[/brettwooldridge/HikariCP]

更新#3:(9月)此时请考虑弃用BoneCP,建议切换到HikariCP。

更新#4:(4月) - 我不再拥有域名,但新所有者保留了旧内容,所以要小心。

wwadge answered -02-11T04:23:38Z

16 votes

当连接超时时我遇到了DBCP问题所以我试用了c3p0。 我打算将其发布到生产中,然后开始进行性能测试。 我发现c3p0的表现非常糟糕。 我无法将其配置为表现良好。 我发现它的速度是DBCP的两倍。

然后我尝试了Tomcat连接池。

这是c3p0的两倍,修复了我在DBCP中遇到的其他问题。 我花了很多时间调查和测试3个池。 如果要部署到Tomcat,我的建议是使用新的Tomcat JDBC池。

user542651 answered -02-11T04:24:19Z

14 votes

对于DBCP的自动重新连接问题,有没有试过使用以下2个配置参数?

validationQuery="Some Query"

testOnBorrow=true

Brandon Teo answered -02-11T04:24:44Z

12 votes

现在已经在生产中使用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");

oᴉɹǝɥɔ answered -02-11T04:25:23Z

11 votes

另一种选择是HikariCP。

这是比较基准

Kunal answered -02-11T04:25:54Z

8 votes

以下是一些文章,表明DBCP的性能远远高于C3P0或Proxool。 另外根据我自己的经验,c3p0确实有一些很好的功能,比如预处理语句池,比DBCP更可配置,但DBCP在我使用它的任何环境中都明显更快。

dbcp和c3p0之间的区别? 绝对没有! (一个酒井开发者博客)[http://blogs.nyu.edu/blogs/nrm216/sakaidelic//12/difference_between_dbcp_and_c3.html]

另请参阅博客文章评论中的JavaTech文章“连接池摊牌”。

Divyesh Kanzariya answered -02-11T04:26:45Z

7 votes

本文中提到了另一种替代方法Proxool。

您可能能够找出Hibernate为其默认连接池实现捆绑c3p0的原因?

toolkit answered -02-11T04:27:16Z

7 votes

不幸的是他们都已经过时了。 DBCP最近有所更新,另外两个是2-3岁,有许多突出的bug。

answered -02-11T04:27:52Z

7 votes

如果配置正确,Dbcp已准备就绪。

例如,它在商业网站上使用,每天350000访客,并且有200个连接池。

如果您正确配置它,它可以很好地处理超时。

版本2正在进行中,并且它具有使其可靠的背景,因为许多生产问题已得到解决。

我们将它用于我们的批处理服务器解决方案,它已经运行了数百个批次,可以在数据库中处理数百万行。

由tomcat jdbc pool运行的性能测试表明它具有比cp30更好的性能。

UBIK LOAD PACK answered -02-11T04:29:02Z

4 votes

刚刚用DBCP浪费了一天半的时间。 即使我使用的是最新的DBCP版本,我也遇到了与j pimmel完全相同的问题。 我根本不推荐使用DBCP,特别是当数据库消失时,它无法将连接从池中抛出,当数据库恢复时无法重新连接,并且无法动态地将连接对象添加回池中(它永远挂起) 一个后JDBCconnect I / O套接字读取)

我现在切换到C3P0。 我在以前的项目中使用过它,它的工作和表现就像一个魅力。

Larry H answered -02-11T04:29:42Z

4 votes

当我们使用mutithreading项目时,c3p0很好。 在我们的项目中,我们使用DBCP同时使用多个线程执行,如果我们使用更多的线程执行,我们就会得到连接超时。 所以我们选择了c3p0配置。

nns answered -02-11T04:30:10Z

3 votes

DBPool是一个易于使用的好选择。

“基于Java的数据库连接池实用程序,支持基于时间的到期,语句缓存,连接验证以及使用池管理器轻松配置。”

[/java/DBPool/]

Soundlink answered -02-11T04:30:52Z

2 votes

我们遇到了需要引入连接池的情况,我们面前有4个选项。

DBCP2

C3P0

Tomcat JDBC

HikariCP

我们根据我们的标准进行了一些测试和比较,并决定选择HikariCP。阅读这篇文章,解释了我们选择HikariCP的原因。

Jeevan Patil answered -02-11T04:31:50Z

0 votes

要以最佳方式实施C3P0,请检查此答案

C3P0:

对于企业应用,C3P0是最好的方法。C3P0是一个易于使用的库,用于扩充传统的(基于DriverManager的)JDBC驱动程序和JNDI可绑定的数据源,包括实现连接和语句池的DataSource,如jdbc3规范和jdbc2标准扩展所述。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();

这里,max和min poolsize定义了连接的边界,这意味着该应用程序将采用的最小和最大连接方式。 MaxIdleTime()定义何时释放空闲连接。

DBCP:

这种方法也很好,但有一些缺点,如连接超时和连接重新发布。当我们使用mutithreading项目时,C3P0是好的。 在我们的项目中,我们使用DBCP同时使用多个线程执行,如果我们使用更多的线程执行,我们就会得到连接超时。 所以我们选择了c3p0配置。我根本不推荐使用DBCP,特别是当数据库消失时,它无法将连接从池中抛出,当数据库恢复时无法重新连接,并且无法动态地将连接对象添加回池中(它永远挂起) 一个后JDBCconnect I / O套接字读取)

谢谢 :)

Md. Sajedul Karim answered -02-11T04:33:17Z

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。