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

2024-03-18

在 HikariCP 的文档中提到

我们强烈建议设置此值,并且它应该比任何数据库级连接超时至少少 30 秒。

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


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


作为记录(在链接更改时在此处包含详细信息),我们正在讨论属性maxLifetime of HikariCP https://github.com/brettwooldridge/HikariCP:

该属性控制池中连接的最长生命周期。正在使用的连接永远不会退休,只有当它关闭时才会被删除。我们强烈建议设置此值,并且它应该比任何数据库或基础设施施加的连接时间限制至少少 30 秒。值 0 表示没有最大生命周期(无限生命周期),当然取决于idleTimeout 设置。默认值:1800000(30 分钟)

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

I suppose连接层对此不做任何事情,因为它依靠上面的池层来处理这些事情。这是不可能的(现已弃用)隐式连接池 https://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm,我不知道是否UCP https://docs.oracle.com/cd/E11882_01/java.112/e12265/intro.htm#BABHFGCA(替代品)可以做到这一点,但如果你使用 HikariCP,你就不会使用那些。

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

(1) OracleDataSource不提供任何配置点 http://download.oracle.com/otn_hosted_doc/jdeveloper/905/jdbc-javadoc/oracle/jdbc/pool/OracleDataSource.html#setConnectionProperties(java.util.Properties)(属性或系统属性)来控制它,我observed无限的寿命。

(2) 服务器端限制参见轮廓参数IDLE_TIME http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6010.htm#SQLRF01310。引用这个答案 https://stackoverflow.com/a/1967638/6730571:

默认情况下,Oracle 不会因不活动而关闭连接。您可以使用 IDLE_TIME 配置配置文件以使 Oracle 关闭不活动的连接。

验证的值是什么IDLE_TIME对于您的用户,结合以下答案本次问答 https://stackoverflow.com/a/42022379/6730571:

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.

Please note there can be other limits enforced elsewhere (firewall... yes I've been bitten by that, although most DB systems have a keep-alive mechanism) that might interfere. So you'd better make it configurable, in case such issues are discovered when you deploy your product.


在 Linux 上,您可以验证物理连接的最大生命周期通过监视连接到数据库的 TCP 套接字。我一直在我的服务器上运行下面的脚本(从数据库的角度来看,这是client主机),它需要 1 个参数,ip:port你的 oracle 节点的,正如它出现在输出中一样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"

If you run that and stop it with ctrl-c during sleep time, it should exit the loop and clean up the temp directory, but this is not 100% foolproof

在结果中所有端口均不应显示超过 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

You'll need to run the script for more than 30 minutes to see that, because it does not know age of sockets that existed before

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时 的相关文章

随机推荐