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

问题描述 投票:4回答:1

在HikariCP的文档中,提到了

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

对于Oracle 11gr2数据库,应考虑哪些数据库级连接超时?我怎么能找到那些超时(查询执行)?

oracle jdbc oracle11g connection-pooling hikaricp
1个回答
2
投票

简答:没有(默认情况下)。


为了记录(如果链接发生变化,这里包括详细信息),我们谈论的是maxLifetimeHikariCP属性:

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

根据我的经验,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不会因为不活动而关闭连接。您可以使用IDLE_TIME配置配置文件,以使Oracle关闭非活动连接。

要验证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分钟)的值,给出或花费一分钟。参见下面的示例输出,第一个示例显示了19个以上的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

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

© www.soinside.com 2019 - 2024. All rights reserved.