在工作中,我们使用了BoneCP(作为c3p0的替代品),据我所知没有遇到任何问题(我自己没有进行升级)。从我看到和了解的内容来看,它似乎是一个设计良好、稳定可靠的库,我个人会选择它而不是其他替代品:它似乎是那些“只需运行”库之一,这很好。
对于DBPool,我没有任何负面评价,只是不太熟悉它。尽管查看其网站文档确实看起来很不错。
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;
}
几年前我们做出选择时,只考虑了c3p0和dbcp。当时c3p0是唯一能在Oracle重启后重新建立连接的。而使用DBCP则需要重新启动应用服务器才能再次运行。
此外,我发现c3p0的调试挂起连接功能非常有用,可以跟踪连接泄漏,否则这可能非常难以找到。
我从c3p0缺少的是执行语句的有用日志记录,包括它们的执行时间信息。
我目前正在大型企业内部网络环境中试用BoneCP。我在使用c3p0时遇到了一些持续的线程问题(如果你深入挖掘,这是相当普遍的问题),因此我进行了研究,看起来它是最好的库。配置有点费劲,但一旦你掌握了它,它似乎非常棒。