Oracle
给出了一种解决方案:使用
DCD(
dead connection detection
)
来确定通信是
否可释放。
简单地说,在
$ORACLE_HOME/network/admin/sqlnet.ora
中设置
SQLNET.EXPIRE_TIME=10
。
数字单位为分钟,Oracle
设置了此参数,如果有会话在不活动状态
10
分钟后,服务器会
向客户机发送一个
10
字节的探测
空包
;如果这个包没有被确认,连接将被关闭,相关的资
源将被释放。
设置
DCD
有两个好处:
1.
若
SQLNET.EXPIRE_TIME
小于
FW
连接的空闲超时时间,那么防火墙
*
可能
*
认为这个
包是活动的,空闲超时
(
防火墙阻断
)
将永远不会发生,客户端和服务器进程都是活的。
2.
若
SQLNET.EXPIRE_TIME
值设置稍高于
FW
空闲限制,那么,一旦
FW
阻断会话发生,
RDBMS
就会知道并关闭连接。
根据
Oracle
官方建议:当连接来自另一个应用程序服务器时,建议使用第一种情况,而第
二种情况适用于客户机应用程序(
The rst case is recommended when the
connection comes from another application server , and the second
makes sense for client applications.
)
注意
:
事实情况中,一些防火墙和更新的防火墙固件可能不会将
DCD
包视为有效的流量,可能
因为
DCD
发送的包实际上是空包。因此,
DCD
可能不会像预期的那样工作,即使已经启
动了
DCD
设置,防火墙
/
交换机仍可能会终止在监控期间空闲的
TCP
套接字。
此情况下,应增加防火墙超时时间,或在设置应用程序空闲时间不超过防火墙上配置的空
闲时间。
配 置 好 SQLNET.EXPIRE_TIME
后
, 如 何 测 试 呢 ? 按 照 Oralce
官 方 文 档
(Doc ID
395505.1)
,方法如下:
方法
1
:
Oracle Sqlnet
客户端跟踪
方法
2
:
Oracle Sqlnet
服务端跟踪
方法
3:
网络嗅探方式(
Sniffer Trace
)
方法
4
:
系统级跟踪(Strace or System level trace)
详细步骤,请详见官方文档进行操作。
参考【
4
】提供一种更为简单的检测方式,
用 tcpdump 来从网络层面检测数据库传递情况
注意:生产环境一般有多块网卡,使用 ip a 命令找到正在使用的那块网卡进行检测。
[oracle@ayaudit network]$ ip a
... ...
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
link/ether 00:50:56:ab:0a:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.123/24 brd XX.XX.XX.XX scope global noprefixroute ens192
评论