【问题标题】:Ungraceful shutdown of connection pools towards Oracle对 Oracle 的连接池的异常关闭
【发布时间】:2022-01-12 09:14:06
【问题描述】:

我对生态系统的了解有限,请原谅我的无知。

我有一个非常大的 Oracle 数据库 (19),其中有很多来自多个应用程序的连接。我们对它设置了最大连接(会话)数量的限制,我们可以很容易地达到这个限制。

我们正在使用 Java 17 + Spring Boot 2.6.1 & HikariCP(考虑 UCP)和 JDBI3

当我在添加连接池之前运行我的应用程序时,我注意到当我不正常地终止我的连接(强行终止应用程序)时,连接在 Oracle 端保持活动很长一段时间(30m+)。关闭带有连接池的应用程序时如何处理?我假设连接池将由 TCP 超时而不是 TCP FIN/ACK 关闭,并且它的工作方式不同,因为应用程序在能够关闭连接之前被杀死,但这是否意味着 Oracle 端的连接会像以前一样活着吗?

TL;DR:我是否需要通过手动关闭连接池来处理不正常的关闭,以避免 Oracle 保持死连接处于活动状态?

或者,我需要联系我们的 Oracle 团队,并以某种方式说服他们降低他们似乎拥有的这种保持活动的价值。

【问题讨论】:

  • 您正在使用连接池 (Hikari),所以不知道为什么您认为您没有使用连接池。
  • 我稍微更改了文本:“当我在添加连接池之前运行我的应用程序时”。问题的主要部分是连接池是否处理不正常的关闭以及 Oracle 是否保持会话活动。不优雅的被终止或直接拉电缆。
  • Spring Boot 默认使用连接池,因此除非您明确禁用/覆盖它,否则您从一开始就一直在使用连接池。我也不确定非正常关闭是什么意思,每次关闭 Spring Boot 应用程序都会导致关闭应用程序上下文,从而关闭连接池(除非您自己手动配置错误!)。除非您直接杀死应用程序以防止关闭,否则一切都会关闭。在后一种情况下,您之后无法关闭任何东西(在应用程序端)。
  • 你确定吗?除非我在 spring 设置中添加 HikariCP,否则“HikariCP 开始”日志不会显示。添加后行为也有所不同。
  • 它不能依赖于连接池的使用:从操作系统的角度来看,“直接”和“cp”连接都是套接字,如果你发出 kill -9 应用程序没有选项来处理它,所以它由操作系统处理 - 它发送 FIN 或 RST。 但是现实世界的行为可能取决于各种因素(操作系统供应商、版本、防火墙等),例如:access.redhat.com/discussions/2990731,您提供的还不够。

标签: java oracle hikaricp ucp


【解决方案1】:

您可以尝试使用通用连接池 (UCP),它有一个内置机制可以在应用程序/JVM 关闭时优雅地关闭连接。

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多