在HikariCP的文档中,提到了
我们强烈建议您设置此值,并且它应该比任何数据库级别的连接超时至少少30秒。
Oracle11.2数据库应该考虑哪些数据库级别的连接超时?我怎么能找到那些超时(查询执行)?
答案 0 :(得分:2)
简答:没有(默认情况下)。
对于记录(如果链接发生变化,此处包含详细信息),我们将讨论HikariCP的maxLifetime
属性:
此属性控制池中连接的最长生命周期。使用中的连接永远不会退役,只有当它关闭时才会被删除。 我们强烈建议您设置此值,并且应该比任何数据库或基础架构施加的连接时间限制至少少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分钟才能看到,因为它不知道之前存在的套接字的年龄