Java数据库连接池(BoneCP vs DBPool vs c3p0)

22

对于一个在J2EE容器之外的Java应用程序来说,哪种连接池库是最好的呢?

  • 我听说c3p0正在过时。
  • Jakarta的常用池库已经不再开发了。

因此我只剩下BoneCPDBPool。从我所看到的,它们都有限制的活动。我能看出的主要区别是性能,BoneCP似乎胜出。然而,文档相当薄弱。

您在真实世界中使用过哪种数据库池库,为什么?优缺点是什么?


3
对于那些好奇的人,我最终选择了BoneCP。 - Stephane Grenier
你有没有BoneCP详细配置文档的链接?或者能否分享一下如何在JBoss中使用BoneCP? - user1556622
6个回答

16

在工作中,我们使用了BoneCP(作为c3p0的替代品),据我所知没有遇到任何问题(我自己没有进行升级)。从我看到和了解的内容来看,它似乎是一个设计良好、稳定可靠的库,我个人会选择它而不是其他替代品:它似乎是那些“只需运行”库之一,这很好。

对于DBPool,我没有任何负面评价,只是不太熟悉它。尽管查看其网站文档确实看起来很不错。


BoneCP的最新版本仍然是0.7.1,这是否意味着它仍处于“beta”阶段或已足够成熟? - Giovanni Botta
1
记住版本控制是非常主观的,需要考虑上下文。因此,确切的值并不是那么重要。一些作者不愿意将他们的库称为1.0版。JDOM在稳定之后花费了几年时间才推出1.0版。所以我的猜测是它已经很稳定,适合使用。 - StaxMan
BoneCP页面上的基准测试[链接](http://jolbox.com/index.html?page=http://jolbox.com/benchmarks.html)看起来很棒。 - aloplop85
1
目前我无法推荐使用BoneCP的最新版本。我已经在生产环境中运行了几天,但它存在不可接受的 错误。 如果我的Java版本是7,我会使用HikariCP。 - Matt Ball
1
@StephaneGrenier 请查看我在之前评论中提供的两个错误链接:https://bugs.launchpad.net/bonecp/+bug/1243551 和 https://bugs.launchpad.net/bonecp/+bug/1259257 - Matt Ball
显示剩余2条评论

4
我们在Tomcat内外都使用C3P0。然而,监控和日志记录并不是最好的,所以我们将开始使用SpringSource连接池。我期待的最好的功能之一是随时显示正在运行的SQL语句。
我们必须添加一个定时器来计算当池已满且所有连接都正忙时,特定连接请求等待连接的时间。
            public Connection getConnection() throws SQLException
            {
                    long t = System.currentTimeMillis();
                    ComboPooledDataSource ds = (ComboPooledDataSource) getDelegate();
                    Connection conn = null;

                    if (ds.getNumBusyConnections() == ds.getMaxPoolSize())
                    {
                            logger.info("Pool (" + ds.getUser() + ") full, waiting for connection");
                            conn = ds.getConnection();
                            t = System.currentTimeMillis() - t;
                            logger.info("Connection busy wait time (" + ds.getUser() + "): " + t + "ms");
                    }
                    else
                    {
                            conn = ds.getConnection();
                    }

                    return conn;
            }

所需考虑的事项如下:
  1. 支持和活跃度(如您所说)
  2. 速度
  3. 监控、记录和生产控制
BoneCP看起来很快(我以前没听说过),但老实说,C3P0对我们来说也足够快了。在我们测试几个4或5年前时,DBCP速度极慢(他们似乎已经修复了这个问题),Oracle的池相当慢,而C3P0非常快。我们的测试结果非常类似于BoneCP网站上的测试结果。
我不知道BoneCP的可管理性。#3在我们的生产环境中已经成为最重要的功能。

关于记录特定的SQL语句,您能否不启用java.sql包的调试日志? - r0ast3d
据我了解,SpringSource池允许通过JMX进行实时检查。 - Scott A
您也可以使用BoneCP启用SQL日志记录:http://jolbox.com/bonecp/downloads/site/apidocs/index.html?com/jolbox/bonecp/BoneCPConfig.html,在“setLogStatementsEnabled”方法下。 - Dan W
1
大多数,如果不是全部,都可以记录日志。问题是,有哪些SQL语句正在运行,以及在哪些线程、哪些池中?您可以通过一些工作从日志中获取这些信息,但从操作角度来看,使用JMX更容易。 - Scott A
@ScottA 对不起,这篇文章很旧了,但您能给一下您提到的SpringSource池的指针吗? - mzzzzb
@mzzzzb SpringSource高并发池附带tcServer。您可以在此处找到配置说明:http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html 您要查找的是“tc Server数据源”。 - Scott A

2

1

几年前我们做出选择时,只考虑了c3p0和dbcp。当时c3p0是唯一能在Oracle重启后重新建立连接的。而使用DBCP则需要重新启动应用服务器才能再次运行。

此外,我发现c3p0的调试挂起连接功能非常有用,可以跟踪连接泄漏,否则这可能非常难以找到。

我从c3p0缺少的是执行语句的有用日志记录,包括它们的执行时间信息。


0

我目前正在大型企业内部网络环境中试用BoneCP。我在使用c3p0时遇到了一些持续的线程问题(如果你深入挖掘,这是相当普遍的问题),因此我进行了研究,看起来它是最好的库。配置有点费劲,但一旦你掌握了它,它似乎非常棒。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接