问题标签 [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.

0 投票
1 回答
800 浏览

java - 通用连接池已存在错误 (Oracle UCP)

我正在尝试使用以下代码创建 UniversalConnectonPool:

但是第三行universalConnectionPoolManager.createConnectionPool((UniversalConnectionPoolAdapter) poolDataSource);抛出异常:

你能告诉我我在这里做错了什么吗?我是使用连接池的新手,所以仍在学习它的来龙去脉。

0 投票
3 回答
853 浏览

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(未知来源)

0 投票
1 回答
485 浏览

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:

Spring Boot 文档说:

Oracle 网站包含有关如何在 Spring Boot 中使用 UCP 的教程(1、2),但没有解释这种设置的任何优点。我发现一个旧的 StackOverflow 答案提到了一些“非阻塞架构”,但我仍然不确定它是否使 UCP 比 HikariCP 更有价值或更可靠。

0 投票
1 回答
277 浏览

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来进行战争可能会导致另一个问题:compileruntime

@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

0 投票
1 回答
38 浏览

javascript - 西里尔文中的 \b 问题(JavaScript 正则表达式)

我有这个正则表达式:(*UCP).*\bпроверка\b.*.它在 regex101.com ( https://regex101.com/r/9elF5c ) 上运行良好,但在 JavaScript 中却不行。

有人可以解释一下问题是什么以及如何解决它

0 投票
1 回答
30 浏览

jdbc - oracle.ucp.jdbc.PoolDataSource.getConnection() 多线程安全吗?

我们可以从多个线程调用 oracle.ucp.jdbc.PoolDataSource.getConnection() 吗?

0 投票
1 回答
84 浏览

java - 如何返回到 oracle.ucp.jdbc.PoolDataSource 的连接?

我有一个oracle.ucp.jdbc.PoolDataSource用于维护 JDBC 连接池的应用程序。我能够建立连接并使用它。

在我的函数结束时,我想将它返回connection到池中。我没有找到任何方法来返回池。

如何将连接返回到池中?

0 投票
0 回答
104 浏览

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 传递。更新后的代码如下:

0 投票
1 回答
63 浏览

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 团队,并以某种方式说服他们降低他们似乎站在他们这边的这种保活价值。