简短回答:无(默认情况下)。
作为记录(在链接更改时在此处包含详细信息),我们正在讨论属性maxLifetime
of HikariCP https://github.com/brettwooldridge/HikariCP:
该属性控制池中连接的最长生命周期。正在使用的连接永远不会退休,只有当它关闭时才会被删除。我们强烈建议设置此值,并且它应该比任何数据库或基础设施施加的连接时间限制至少少 30 秒。值 0 表示没有最大生命周期(无限生命周期),当然取决于idleTimeout 设置。默认值:1800000(30 分钟)
根据我的经验,HikariCP 这样做是一件好事。据我所知默认情况下,Oracle 不强制连接的最大生存期(既不在 JDBC 驱动程序端 (1),也不在服务器端 (2))。所以在这方面,“基础设施施加的连接时间限制“是+无穷大——这对我们来说是一个问题,因为我们确实观察到了长期连接的问题。这也意味着任何值都是”至少少30秒”,包括默认值:)
I suppose连接层对此不做任何事情,因为它依靠上面的池层来处理这些事情。这是不可能的(现已弃用)隐式连接池 https://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm,我不知道是否UCP https://docs.oracle.com/cd/E11882_01/java.112/e12265/intro.htm#BABHFGCA(替代品)可以做到这一点,但如果你使用 HikariCP,你就不会使用那些。
现在,对于给定的连接 30 分钟后(通常是在出于各种目的多次重复使用之后),HikariCP 会关闭它并创建一个新的连接。这样做的成本非常小,并且解决了我们与长期连接的问题。我们对这个默认值很满意,但为了以防万一,仍然可以配置它(参见下面的 2)。
(1) OracleDataSource
不提供任何配置点 http://download.oracle.com/otn_hosted_doc/jdeveloper/905/jdbc-javadoc/oracle/jdbc/pool/OracleDataSource.html#setConnectionProperties(java.util.Properties)(属性或系统属性)来控制它,我observed无限的寿命。
(2) 服务器端限制参见轮廓参数IDLE_TIME http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6010.htm#SQLRF01310。引用这个答案 https://stackoverflow.com/a/1967638/6730571:
默认情况下,Oracle 不会因不活动而关闭连接。您可以使用 IDLE_TIME 配置配置文件以使 Oracle 关闭不活动的连接。
验证的值是什么IDLE_TIME
对于您的用户,结合以下答案本次问答 https://stackoverflow.com/a/42022379/6730571:
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
.
Please note there can be other limits enforced elsewhere (firewall... yes I've been bitten by that, although most DB systems have a keep-alive mechanism) that might interfere. So you'd better make it configurable, in case such issues are discovered when you deploy your product.
在 Linux 上,您可以验证物理连接的最大生命周期通过监视连接到数据库的 TCP 套接字。我一直在我的服务器上运行下面的脚本(从数据库的角度来看,这是client主机),它需要 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"
If you run that and stop it with ctrl-c during sleep
time, it should exit the loop and clean up the temp directory, but this is not 100% foolproof
在结果中所有端口均不应显示超过 1800 秒的值(即 30 分钟),或多或少一分钟。请参阅下面的示例输出,第一个示例显示 2 个套接字超过 1800 秒,它们在 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
You'll need to run the script for more than 30 minutes to see that, because it does not know age of sockets that existed before