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

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

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

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

Apache DBCP - [http://commons.apache.org/dbcp/]

C3P0 - [http://sourceforge.net/projects/c3p0]

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

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

15个解决方案

174 votes

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

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

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

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

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

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

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

168 votes

我邀请您试用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,但新所有者保留了旧内容,所以要小心。

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

16 votes

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

然后我尝试了Tomcat连接池。

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

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

14 votes

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

validationQuery="Some Query"

testOnBorrow=true

Brandon Teo answered 2019-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 2019-02-11T04:25:23Z

11 votes

另一种选择是HikariCP。

这是比较基准

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

8 votes

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

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

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

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

7 votes

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

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

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

7 votes

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

answered 2019-02-11T04:27:52Z

7 votes

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

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

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

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

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

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

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

4 votes

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

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

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

4 votes

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

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

3 votes

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

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

[http://www.snaq.net/java/DBPool/]

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

2 votes

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

DBCP2

C3P0

Tomcat JDBC

HikariCP

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

Jeevan Patil answered 2019-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 2019-02-11T04:33:17Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是我对你的问题的回答: 常用的数据库连接池DBCPc3p0 和 Druid。它们都是用来提高数据库连接的效率和性能的。 以下是它们的配置说明: 1. DBCP DBCP 是 Apache 开源组织提供的连接池,配置方式如下: ``` <!-- 引入 DBCP 依赖 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- 配置 DBCP 连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="10000" /> </bean> ``` 2. c3p0 c3p0 是一个开源的 JDBC 连接池,配置方式如下: ``` <!-- 引入 c3p0 依赖 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- 配置 c3p0 连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test" /> <property name="user" value="root" /> <property name="password" value="root" /> <property name="maxPoolSize" value="100" /> <property name="minPoolSize" value="30" /> <property name="maxIdleTime" value="10000" /> </bean> ``` 3. Druid Druid 是阿里巴巴开源的 JDBC 连接池,配置方式如下: ``` <!-- 引入 Druid 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- 配置 Druid 连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="initialSize" value="10" /> <property name="maxActive" value="100" /> <property name="minIdle" value="30" /> <property name="maxWait" value="10000" /> </bean> ``` 以上就是这些连接池的基本配置方式。具体的配置可以参考各个连接池的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值