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

Nav*_*buE 5 oracle connection-pooling jdbc oracle11g hikaricp

在HikariCP的文档中,提到了

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

Oracle11.2数据库应考虑哪些数据库级别的连接超时?我如何找到那些超时(执行查询)?

Hug*_* M. 9

简短回答:无(默认)。


为了记录(包括在此细节情况下,链接的变化),我们谈论的是财产maxLifetimeHikariCP

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

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

连接层对此没有做任何事情,因为它依靠上面的池层来处理这些事情。(现已弃用)隐式连接池是不可能的,我不知道UCP(替代品)是否这样做,但如果您使用 HikariCP,您就不会使用它们。

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

(1)OracleDataSource不提供任何配置点(属性或系统属性)来控制它,我观察到了无限的生命周期。

(2) 服务端限制见profile参数IDLE_TIME。引用 这个答案

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

要验证IDLE_TIME您的用户的价值,请结合此问答中的答案:

select p.limit
from dba_profiles p, dba_users u
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...'
;
Run Code Online (Sandbox Code Playgroud)

默认值为UNLIMITED

请注意,其他地方可能会强制执行其他限制(防火墙......是的,我已经被它咬了,尽管大多数数据库系统都有一个保持活动的机制)可能会干扰。因此,您最好将其设置为可配置的,以防在您部署产品时发现此类问题。


在 Linux 上,您可以通过监视连接到数据库的 TCP 套接字来验证物理连接最大生命周期。我一直在我的服务器上运行下面的脚本(从数据库的角度来看,它是客户端主机),它需要 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"
Run Code Online (Sandbox Code Playgroud)

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

在结果中,任何端口都不应显示超过 1800 秒(即 30 分钟)的值,请给予或花费一分钟。请参见下面的示例输出,第一个示例显示 1800 秒以上的 2 个套接字,它们在 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
Run Code Online (Sandbox Code Playgroud)

您需要运行脚本超过 30 分钟才能看到,因为它不知道之前存在的套接字的年龄