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