【发布时间】: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,您提供的还不够。