有人有在实际生产负载下使用 Oracle UCP 的经验吗?它是否能很好地处理数据库重新连接?是否存在多线程问题?有人将它与 C3P0 或 Apache DBCP 进行比较吗?
6 回答
我评估了 UCP 11.2.0.1作为我们旧版连接池的替代品,但我不能推荐它:
- 它不完全支持 jdk 6 / ojdbc6.jar。例如,语句缓存和 jmx 支持的使用不适用于 java 6 并引发异常。
- 没有内部语句缓存- 它依赖于 jdbc 驱动程序的语句缓存 (
setPoolable()
) - 我将这两个问题都提交给了 oracle,他们确认了并且可能会在 oracle 12.0 发布时修复它。但即使这样也不确定。
- 发布太少(3 年内发布 2 个),社区支持太少。
- 不是开源的
- 几乎不可扩展。只有少数回调具有糟糕的界面设计。
示例:您希望在连接超过其 TTL 时收到通知?准备包装数据源和大量使用内部/专有 UCP API。官方文档(最后更新:2008 年)保持沉默如何实现这一点。 - 胖设计(几乎是一个 0,5 MB 的 jar)——许多具有相似名称/功能的类(例如,有 a
PoolDataSource
和ConnectionPool
a——两者都相关但调用方式不同,并提供略有不同的功能。) - 仅限java.util.logging
更新 1(2014 年 4 月):
虽然有点偏离主题:根据我的评估,我决定使用新的tomcat jdbc-pool - 它在多个生产系统中运行一年以来几乎完美。它设计得非常好,定期更新,可扩展,并且 apache tomcat 团队在回答问题/修复问题方面做得很好。
更新 2(2016 年 7 月):
我现在可以强烈推荐HikariCP,我目前更喜欢所有其他连接池。
它的架构、对正确性和性能的关注令人惊叹。
我在一个每秒大约 10 个事务(平均)和每秒 360 个事务峰值的系统中使用了 UCP,还没有问题。(数字是每台应用服务器,有 8 台服务器)
但是,您从 UCP 获得的主要好处是当您使用 Oracle RAC 和TAF/FAN 功能、带有 Dataguard 的 UCP或在应用服务器之外运行某些东西时。
我已经描述了与隐式连接缓存相比,我在 UCP 中观察到的性能/可扩展性问题:https ://stackoverflow.com/a/27512252/676877
我见过多个客户在生产中使用 UCP。我没有看到你关心的问题。它在负载下表现得非常好。并且可以处理重新连接。重新连接策略是可配置的。它也很好地支持RAC。
但是使用商业连接池的真正好处是有人对您遇到的任何问题负责。您会惊讶于有多少人尝试开发和维护自己的连接池。
我刚刚在我们的基于 Eclipse Link 的应用程序中尝试了 UCP,我遇到了 ORA-0100:每次都超过了最大打开游标。我已将参数 MaxStatements 设置为 10,但这没有效果。我检查了堆,有数百个 T4CPreparedStatement 对象存活但不到 10 个包装语句。所以在我无法控制的地方有一个巨大的语句缓存。
Tomcat jdbc 池就像一个魅力。
通过使用连接池(IBM RAD)到 oracle,我得到了更快的结果。与普通编程概念相比。在连接池属性中,默认情况下最大连接数为 10,理想超时为 180 秒.
在这里我们可以设置用户一次访问的最大用户数....