Oracle Net 12c DCD (Dead Connection Detection ) 功能的改变 (Doc ID 2403921.1)
Oracle Net 12c: DCD (Dead Connection Detection ) 功能的改变 (Doc ID 2403921.1)
适用于:
Oracle Net Services - 版本 12.1.0.2 到 12.2.0.1 [发行版 12.1 到 12.2]
本文档所含信息适用于所有平台
用途
本文档描述了在 12.1 版本上 DCD 功能的改变以及新的实现方式。
详细信息
之前 DCD 的实现方式使用 TNS 包并且依赖于底层的 TCP 发送失败。TCP 层需要重新发送以及传输探测包 – 导致一个断开的操作可能需要几分钟。而 DCD 新的实现方式使用了 KEEPALIVE 选项。
操作系统的 TCP keepalive 有3个参数(这是 Linux 参数,当然其它操作系统也有类似的参数)
TCP_KEEPALIVE_TIME (发送一个 keepalive 包之前需要等待的时间)
TCP_KEEPCNT (发送几次探测包)
TCP_KEEPINTVL (发送每个 keepalive 包之间的间隙)
现在 sqlnet.ora 的参数 SQLNET.EXPIRE_TIME 会设置 TCP_KEEPALIVE。
如果 sqlnet.expire_time=1,那么 TCP_KEEPALIVE 会被设置为60秒。参数 KEEPINTVL 和 KEEPCNT 会被设置为6和10(这是非常合理的)。这意味着,DCD 的最小值只能设置为2分钟。
有几种方式可以检测 DCD 是否已经设置。
请注意,除非链接的空闲时间(线缆上没有流量)达到 DCD 设置(SQLNET.EXPIRE_TIME)的2倍,否则 keepalive 包不会被发送。
检测 Oracle 进程的 OS trace(比如 strace)。tcp socket 选项可以确认 TCP Idle Time 已经被设置。这是 Linux 的例子:
setsockopt(19, SOL_TCP, TCP_KEEPALIVE_TIME, [60])
检测 TCP trace(比如 tcpdump 或者 snoop)
如果是通过 Wireshark 检查,可以简单的过滤 for: tcp.analysis.keep_alive
Oracle Net server trace: 查询字符串"ntconbrok"并检查日志
如果当前的 OS 不支持设置 keepalive,那么会使用旧的 DCD 实现方式。
如果,因为某种原因,需要设置旧的 DCD 实现方式(发送10字节的 TNS 数据),那么请在 sqlnet.ora 中设置 USE_NS_PROBES_FOR_DCD=true 。
有时需要在TNS连接串中加入 (ENABLE=BROKEN) 。对于某些平台上的 JDBC Thin, Thick 和 OCI 连接是这样的。
比如 在 (DESCRIPTION= 句子中设置
net_service_name=
(DESCRIPTION=
(ENABLE=BROKEN)
(ADDRESS=(PROTOCOL=tcp)(HOST=
(ADDRESS=(PROTOCOL=tcp)(HOST=
)
(CONNECT_DATA=
(SERVICE_NAME=test.us.example.com)
)
)
jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=myhost))(CONNECT_DATA=(SID=
参考
Oracle Net 12c: Changes to the Functionality of Dead Connection Detection (DCD) (Doc ID 1591874.1)