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

时间:2016-09-30 20:12:36

标签: oracle jdbc oracle11g connection-pooling hikaricp

在HikariCP的文档中,提到了

  

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

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

1 个答案:

答案 0 :(得分:2)

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

对于记录(如果链接发生变化,此处包含详细信息),我们将讨论HikariCPmaxLifetime属性:

  

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

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

假设连接层没有对此做任何事情,因为它依靠上面的池层来处理这些事情。 ({现在已弃用)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分钟才能看到,因为它不知道之前存在的套接字的年龄