问题标签 [ucp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 通用连接池已存在错误 (Oracle UCP)
我正在尝试使用以下代码创建 UniversalConnectonPool:
但是第三行universalConnectionPoolManager.createConnectionPool((UniversalConnectionPoolAdapter) poolDataSource);
抛出异常:
你能告诉我我在这里做错了什么吗?我是使用连接池的新手,所以仍在学习它的来龙去脉。
upgrade - Ojdbc8 jars 升级到 21.1.0.0 抛出 Nosuchmethod 异常 UCPservletContextListener init
ojdbc8、ons、ucp jars升级到21.1.0.0版本。当尝试在 tomcat 服务器上启动应用程序时,它会抛出 Nosuchmethod 异常。登录 Tomcat 的 localhost.log 文件。应用程序在启动过程中尝试建立数据库连接。
2021 年 6 月 1 日 15:59:56.641 信息 [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 在类路径上检测到 3 个 Spring WebApplication 初始化程序 2021 年 6 月 1 日 16:00:05.365 信息 localhost-startStop -1 org.apache.catalina.core.ApplicationContext.log 初始化 Spring 嵌入式 WebApplicationContext 01-Jun-2021 16:00:19.397 SEVERE localhost-startStop-1 org.apache.catalina.core.StandardContext.listenerStart 配置类的应用程序侦听器时出错[oracle.ucp.jdbc.UCPServletContextListener] java.lang.NoSuchMethodException: oracle.ucp.jdbc.UCPServletContextListener.init at java.lang.class.getConstructor(未知来源)
oracle - 对于现代应用程序,我应该使用 Oracle 的 UCP 还是 HikariCP?
对于使用 Oracle OLTP 数据库作为数据源的现代后端 Java 应用程序,我应该使用哪一个?
对我来说,HikariCP 看起来像是现代 Java 应用程序的事实上的标准池。但现在我需要维护一些过去的项目,该项目目前停留在 Oracle 驱动程序 v11 并使用 UCP。我现在想知道:Oracle 的UCP比HikariCP有什么优势吗?你会使用 UCP 还是 HikariCP?
在start.spring.io生成的新 Spring Boot 项目将默认使用 HikariCP(尽管从 2.4 开始支持 UPC),直到您在 application.properties 中明确强制执行 UCP:
Oracle 网站包含有关如何在 Spring Boot 中使用 UCP 的教程(1、2),但没有解释这种设置的任何优点。我发现一个旧的 StackOverflow 答案提到了一些“非阻塞架构”,但我仍然不确定它是否使 UCP 比 HikariCP 更有价值或更可靠。
oracle - Oracle 的 ucp.jar 应该驻留在 Tomcat 的 lib 还是应用程序的 war 中?缺少 ResultSetMetaData。使用 Oracle 实现 Tomcat 应用程序的干净重新部署?
假设是 2016 年。我正在构建一个非常简单的 Java EE 应用程序,其中包含用于 DI 的 Spring、jdbc 模板和 Web、用于持久性的 Oracle,并将其部署到 Tomcat。听起来很简单,不知道它是否可以更微不足道。
有以下最新的稳定版本:
- 雄猫 8.5
- Oracle jdbc 驱动程序 v 12.x
- 和 Spring 4.3.x
Tomcat建议把 jdbc 驱动放到$CATALINA_BASE/lib
.,所以我遵循这个建议。Oracle建议使用他们的 UCP 池,oracle.com 上的教程也建议ucp.jar
与 ojdbc.jar 放在一起(到 Tomcat 的 lib 文件夹)。我使用 Spring 来管理 UCP 池的生命周期并将其作为数据源传递给JdbcTemplate
.
我在生产中使用单个专用服务器,为了给我的用户提供最佳体验,我使用了 Tomcat 的并行部署功能。此功能没有什么特别之处,它允许在不停机的情况下部署新版本,并在没有活动会话时自动(并且优雅地)取消部署旧版本。
缺失的ResultSetMetaData
问题
使用如此简单的设置部署新版本的应用程序后,我可能会遇到意想不到的问题:
现在应用程序坏了。任何后续尝试拨打涉及ResultSetMetaData
(ie jdbcTemplate.queryForObject("select 'hello' from dual", String.class)
) 的电话都将失败,并显示:
如何重现
不幸的是,我不了解异常的根本原因。是ResultSetMetaData
一个JDK类,怎么找不到呢?是卸载了吗?至少经过一些实验,我确切地知道重现它所需的最少步骤:
- 部署第一个版本的应用程序和初始化数据库池(即使用简单的连接,但不涉及
ResulstSetMetaData
,即jdbcTempalte.query()
)。 - 部署应用程序的第二个版本
- 等待第一个版本取消部署(尽可能优雅)
- 并拨打涉及 的电话
ResultSetMetaData
。 - 繁荣!
ResultSetMetaData
再次找不到,应用程序已损坏。
此错误不依赖于 Tomcat 的并行部署功能。您可以拥有最新的 (9.x) Tomcat 和库存配置,2 个不同的 webapps 使用相同的 Oracle jdbc 驱动程序,按照我上面描述的顺序和相同的条件部署它,并得到相同的错误。
另外我想补充一点,Tomcat的以下陈述是不正确的:
此 Web 应用程序实例已停止
我确切地知道第二个(刚刚部署的)应用程序被调用(不是卸载的),它是活动的并且无法停止。但它未能达到ResultSetMetaData
它的方式。
在 docker-compose 的帮助下,我做了很多实验来隔离问题,看看有什么可以解决的。解决问题的一件事是将放入 Tomcat 的库ucp.jar
中.war
,而不是放入 Tomcat 的库中。这就是标题中问题的原因:
Oracle 的 ucp.jar 应该驻留在 Tomcat 的库中还是捆绑到应用程序的战争中?
ucp.jar
它本身不是一个在全球服务提供商处注册的 jdbc 驱动程序。您是否将 HikariCP 放入 Tomcat 的库中?我不这么认为。将 ucp 捆绑到 webapp 可以解决ResultSetMetaData
问题。将 ucp.jar 放到 Tomcat 中还有其他原因lib
吗?
破碎的反射
不幸的是,通过在 Maven 中对其进行设置或范围ucp.jar
来进行战争可能会导致另一个问题:compile
runtime
@EnableTransactionManagement
在您添加Spring Java 配置或<tx:annotation-driven/>
如果您更喜欢 XML时,上下文不会立即启动。但我确实想@Transactional
在我的应用程序中使用注释。所以我又被困住了。在这里至少我能够理解这个问题。Spring 4 尝试读取注释PoolDataSourceImpl
以查看 bean 是否需要代理以支持基于注释的事务控制。Class#getAnnotations()
无法读取类上的注释,PoolDataSourceImpl
因为oracle.jdbc.logging.annotations.Feature
存在于两个 jar(ucp 和 jdbc)中。并且有 2 个类加载器具有不同的Class<oracle.jdbc.logging.annotations.Feature>
. 内省功能上的部分PoolDataSourceImpl
被一个奇怪的东西打破了ArrayStoreExceotion
!此类错误的存在是将两个 Oracle jar 保存在同一类路径中的一个论据。
如果你在 2016 年(当时还没有更高版本的 Oracle 驱动)遇到上述问题,你会怎么做?我问这个,因为我从事的项目在过去有点卡住了。早些时候,升级 Oracle 驱动程序在生产中导致了意想不到的和不明显的问题,所以在最近的版本中,我们对更新 jdbc 驱动程序犹豫不决。但由于项目最近从Tomcat 7升级到Tomcat 8,现在有面临缺失ResultSetMetaData
问题的风险,应该解决。
我忘了说:您可能会遇到堆栈跟踪抱怨在ResultSetMetaData
以前版本的 Tomcat:7.x 中丢失。但它并没有破坏可观察到的行为。与 Tomcat 9.x 和 8.x 不同,Tomcat 7.x 打印了一次异常,但不知何故设法执行了查询并成功处理了请求。Tomcat 7.x 没有破坏应用程序。是不是意味着现代 Tomcat 有 Tomcat 7.x 没有的回归?
潜在的内存泄漏 Tomcat 警告
我在重新部署时也不喜欢的是日志中的以下几行:
有可能修复它们吗?根据我的测试,它们不是由 UCP 引起的,而是来自 ojdbc.jar。我在这里没有找到任何解决方案。无论是最新版本的 ojdbc8(或 ojdbc11),还是使用 Oracle 的其他池或生命周期方法UniversalConnectionPoolManager
(如此处建议的那样)都没有帮助。如果您将 ojdbc 替换为 postgres 数据库和驱动程序,您将不会看到类似的警告,并且您的日志将是干净的。
源代码
我没有在帖子中提供任何代码,它已经很长了,但是我创建了一个带有最小应用程序示例和参数化 docker-compose 测试的repo 。因此,您可以轻松地使用它并使用单个命令重现我提到的所有问题:docker-compose rm -fs && docker-compose up --build
javascript - 西里尔文中的 \b 问题(JavaScript 正则表达式)
我有这个正则表达式:(*UCP).*\bпроверка\b.*.
它在 regex101.com ( https://regex101.com/r/9elF5c ) 上运行良好,但在 JavaScript 中却不行。
有人可以解释一下问题是什么以及如何解决它
jdbc - oracle.ucp.jdbc.PoolDataSource.getConnection() 多线程安全吗?
我们可以从多个线程调用 oracle.ucp.jdbc.PoolDataSource.getConnection() 吗?
java - 如何返回到 oracle.ucp.jdbc.PoolDataSource 的连接?
我有一个oracle.ucp.jdbc.PoolDataSource
用于维护 JDBC 连接池的应用程序。我能够建立连接并使用它。
在我的函数结束时,我想将它返回connection
到池中。我没有找到任何方法来返回池。
如何将连接返回到池中?
java - Oracle 通用连接池 (UCP) 可以与 Postgresql 一起使用吗?
是否可以使用 Java 中的通用连接池 (UCP) 为 postgresql 创建连接池。你能提供任何示例java代码吗?
我尝试了以下代码片段:
但它因 SQLException 而失败
java.sql.SQLException:无法设置数据源名称:java.lang.reflect.InvocationTargetException。
不确定我是否遗漏了代码中的任何内容。
有一个更新:我通过添加一个唯一的数据源名称来修复上面的问题,如下所示:
但是遇到一个不同的问题,即使设置了 URL,它也会尝试连接到默认的 localhost:5432 并且连接失败,因为我的 postgresql 不在我的 localhost 中。任何线索为什么它不采用 setURL 方法中提供的 URL?
更新:我们需要将 URL 添加为连接属性而不是直接数据源属性。postgres 的 JDBC 驱动程序被配置为使用一个定义了数据源类的 PGPolingDataSource。
定义数据源类时,连接 url 必须通过连接属性而不是连接 url 传递。更新后的代码如下:
java - 对 Oracle 的连接池异常关闭
我对生态系统的了解有限,请原谅我的无知。
我有一个非常大的 Oracle 数据库 (19),有很多来自多个应用程序的连接。我们已经对它设置了最大连接(会话)数量的限制,我们可以很容易地达到这个限制。
我们正在使用 Java 17 + Spring Boot 2.6.1 & HikariCP (考虑 UCP) & JDBI3
当我在添加连接池之前运行我的应用程序时,我注意到当我不优雅地终止我的连接(强行终止应用程序)时,连接在 Oracle 端保持活动很长一段时间(30m+)。关闭带有连接池的应用程序时如何处理?我假设连接池将由 TCP 超时而不是 TCP FIN/ACK 关闭,并且它的工作方式不同,因为应用程序在能够关闭连接之前被杀死,但这是否意味着 Oracle 端的连接会像以前一样活着吗?
TL;DR:我是否需要通过手动关闭连接池来处理不正常的关闭,以避免 Oracle 使死连接保持活动状态?
或者,我需要联系我们的 Oracle 团队,并以某种方式说服他们降低他们似乎站在他们这边的这种保活价值。