gpt4 book ai didi

oracle - HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时

转载 作者:行者123 更新时间:2023-12-02 03:04:12 32 4
gpt4 key购买 nike

在 HikariCP 的文档中提到

We strongly recommend setting this value, and it should be at least 30 seconds less than any database-level connection timeout.

Oracle11.2 数据库应考虑哪些数据库级连接超时?我怎样才能找到这些超时(要执行的查询)?

最佳答案

简短回答:无(默认情况下)。

<小时/>

郑重声明(在链接更改时包含详细信息),我们正在讨论 HikariCP 的属性 maxLifetime :

This property controls the maximum lifetime of a connection in the pool. An in-use connection will never be retired, only when it is closed will it then be removed. We strongly recommend setting this value, and it should be at least 30 seconds less than any database or infrastructure imposed connection time limit. A value of 0 indicates no maximum lifetime (infinite lifetime), subject of course to the idleTimeout setting. Default: 1800000 (30 minutes)

根据我的经验,HikariCP 这样做是一件好事。据我所知,默认情况下,Oracle 不会强制连接的最大生存期(无论是在 JDBC 驱动程序端 (1) 还是在服务器端 (2))。因此,在这方面,“基础设施强加的连接时间限制”是无穷大——这对我们来说是一个问题,因为我们确实观察到了长期连接的问题。它还意味着任何值“至少少 30 秒”,包括默认值:)

假设连接层不会对此做任何事情,因为它依靠上面的池层来处理这些事情。这是不可能的(现已弃用)implicit connection pool ,我不知道是否 UCP (替代品)可以做到这一点,但如果您使用 HikariCP,您就不会使用这些。

现在,对于给定的连接,30 分钟后(通常是在出于各种目的多次重复使用之后),HikariCP 会关闭它并创建一个新的连接。这样做的成本非常小,并且解决了我们与长期连接的问题。我们对这个默认设置很满意,但为了以防万一,仍然可以对其进行配置(请参见下面的 2)。

(1) OracleDataSource 不提供任何 configuration point (属性或系统属性)来控制它,并且我观察无限的生命周期。

(2) 有关服务器端限制,请参阅 profile parameter IDLE_TIME 。引用 this answer :

Oracle by default will not close a connection due to inactivity. You can configure a profile with an IDLE_TIME to cause Oracle to close inactive connections.

要验证您的用户的 IDLE_TIME 值,请结合 this Q&A 中的答案:

select p.limit
from dba_profiles p, dba_users u
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...'
;

默认值为UNLIMITED

请注意,其他地方可能会强制实现其他限制(防火墙...是的,我已经被这个问题困扰了,尽管大多数数据库系统都有保持事件机制),这可能会造成干扰。因此,您最好使其可配置,以防在部署产品时发现此类问题。

<小时/>

在 Linux 上,您可以通过监视连接到数据库的 TCP 套接字来验证物理连接的最大生命周期。我一直在我的服务器上运行下面的脚本(从数据库的角度来看,它是客户端主机),它需要 1 个参数,即 Oracle 节点的 ip:port ,就像它出现在 netstat -tan 的输出中一样(如果您有多个节点,则为一个模式)。

#!/bin/bash
target="$1"
dir=$(mktemp -d)
while sleep 10
do
echo "------------ "$(date)
now=$(date +%s)
netstat -tan | grep " $target " | awk '{print $4}' | cut -f2 -d: | while read port
do
file="p_$port"
[ ! -e $file ] && touch $file
ftime=$(stat -c %Z "$file")
echo -e "$port :\t "$(( now - ftime))
done
done
\rm "$dir"/p_*
\rmdir "$dir"

如果你运行它并在 sleep 期间使用 ctrl-c 停止它,它应该退出循环并清理临时目录,但这并不是 100% 万无一失

在结果中所有端口都不应显示超过 1800 秒的值(即 30 分钟),相差一分钟。请参阅下面的示例输出,第一个示例显示 2 个套接字超过 1800 秒,它们在 10 秒后消失。

------------ Thu Jul 6 16:09:00 CEST 2017
49806 : 1197
49701 : 1569
49772 : 1348
49782 : 1317
49897 : 835
49731 : 1448
49620 : 1830
49700 : 1569
49986 : 523
49722 : 1498
49715 : 1509
49711 : 1539
49629 : 1820
49732 : 1448
50026 : 332
49849 : 1036
49858 : 1016
------------ Thu Jul 6 16:09:10 CEST 2017
49806 : 1207
49701 : 1579
49772 : 1358
49782 : 1327
49897 : 845
49731 : 1458
49700 : 1579
49986 : 533
49722 : 1508
49715 : 1519
49711 : 1549
49732 : 1458
50026 : 342
49849 : 1046
49858 : 1026

您需要运行该脚本 30 分钟以上才能看到这一点,因为它不知道之前存在的套接字的年龄

关于oracle - HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799401/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com