oracle 的DCD(Dead Connection Detection)机制

导语:最近遇到空闲会话增多,导致会话数量超过上限的情况。在网上查找资料有一个oracle的特性,就是DCD,也就是死链接检测。虽然我遇到的问题是空闲会话的连接问题,并不是网络导致的死连接。但是还是记录下来。方便以后的学习和查找。

Dead Connection Detection 是 Oracle 数据库的一个有用功能:它允许清理 “dead” 会话,这样它们就不会在消耗内存和其他系统资源时徘徊。
这个想法很简单:如果数据库检测到客户端进程不再连接到其服务器进程,它会进行清理。这可能以多种方式发生,在大多数情况下,此类问题是由最终用户触发的。

不应将死连接与空闲连接混淆:空闲连接仍会维护客户端和服务器进程之间的网络链接,只是没有活动。空闲连接不是通过 DCD 维护/控制的,数据库中还有其他工具可以处理此类情况。

12c 之前的 DCD 实现使用 TNS 包来“ping”客户端,并依赖于底层 TCP 堆栈,这有时可能需要更长的时间。
现在在 12c 中,这种情况已经改变,DCD 探测由 TCP Stack 实现。DCD 探测器现在将使用 TCP KEEPALIVE 套接字选项来检查连接是否仍然可用。

出处:(https://martincarstenbach.com/2019/09/13/dead-connection-detection-dcd-and-the-oracle-database/)

总结:

  1. DCD连接通常指用户没有正常断开连接而重启客户端,关机以及网络问题导致客户端无法与服务器正常通信所致的连接
  2. 相对于DCD连接,INACTIVE session则是用户建立连接之后,尚未执行任何操作或操作已经完成但没有断开,等同于与处于idle状态
  3. 无论是DCD连接,还是出于idle状态的INACTIVE session,在v$session视图呈现的都是INACTIVE状态
  4. 对于使用resource_limit及profile配置后用户session超出idle_time的情形,在v$session视图呈现sniped状态
  5. 当在sqlnet.ora配置文件中设置了SQLNET.EXPIRE_TIME参数为非零值时,僵死连接在EXPIRE_TIME指定的时间后被清除
  6. 设定SQLNET.EXPIRE_TIME为非零值之后,系统需要产生而外的开销以及带来网络性能的下降

出处:使用 SQLNET.EXPIRE_TIME 清除僵死连接

关于Oracle的DCD机制这篇文章写的非常好:ORACLE的Dead Connection Detection浅析

DCD与OS的网络和防火墙的关系很多,容易出现各种问题:Oracle DCD和Linux TCP KeepAlive和网络硬件防火墙探讨

还可以利用DCD的机制(定时发空包)解决防火墙的问题:
Oracle配置DCD避免会话被防火墙强制断开

posted @   老牛的田  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示