ORACLE DCD(dead connection detection)特性

DCD介绍:

主要用于客户端因异常与DB断链,造成原先的连接不可用,oracle会检测连接,若检查到异常,将该些连接清除。sqlnet.ora文件中的expire_time指定检测间隔时间

 

DCD原理:

当一个新的数据库连接建立后,DCD会为这个连接创建一个定时器,当该定时器到达指定时间间隔后,就会向客户端发送一个probe package(侦测包),该包实质上是一个空的SQL*NET包,不包括任何有用数据。如果此时客户端连接还是正常的话,那么这个probe package就会被客户端直接丢弃,然后Oracle服务器就会把该连接对应的定时器重新复位。如果客户异常退出的话,侦测包由客户端的IP层交到TCP层时,就会发现原先的连接已经不存在了,然后TCP层就会返回错误信息,该信息被Oracle服务端接收到后,Oracle就会知道该连接已经不可用了,于是SQL*NET就会向操作系统发送消息,释放该连接资源。

 

问题案例:客户端无法连接数据库;

初步检查:

查询V$process中连接数同数据库中配置的连接数上限近一致

但查看连接DB的应用程序的当前占用连接池总数是小于DB视图v$process中的数量

故判断可能存在大量连接未释放所导致

 

模拟测试:

当前有一个AS连接到当前DB,将该AS连接池连接数设置为10,启动应用

在DB上netstat将发现有10条来自AS的连接

此时拔掉AS的网线,将查到10条连接都未释放

再连上网线,又多了10条连接,共20条了;

【原因分析】oracle不会将已断掉的连接自动释放,尽管pmon会定时清理这些连接,但pmon执行周期并不固定,故这些无用连接会长时间占用oracle的连接资源,导致新的连接无法建立

 

解决办法:

修改$ORACLE_HOME/network/admin/sqlnet.ora文件中expire_time参数(单位分钟)

修改完后无需重启ORACLE,对所有新连接会自动生效,旧连接不起作用

【注】确认DCD已启用,要把参数TRACE_LEVEL_SERVER、TRACE_DIRECTORY_SERVER去除,否则产生大量trace,影响性能

 

模拟测试:将AS网线拔掉,超过1分钟后,在DB上netstat,发现原先连接仍未释放,trace文件生成了,说明sqlnet修改生效但为何未清除连接?

根据DCD原理,网络正常情况下,sqlnet会在规定时间内清除无用连接,但网络中断,就如该问题,这又涉及网络方面基础,TCP/IP有超时重传机制,当网络包发送超出一定时间没有响应,发送端认为网络异常,未到目的地,所以固定周期后反复重发,当达到重发最大次数若还未成功,则放弃发送,这个周期很长,故出现了上述问题

修改测试:将AS网线拔掉,等待几秒,当AS出现sql连接异常报错时,连上网线,恢复DB连接,在DB上查看旧连接仍为释放,等待1分钟后再查看,旧连接将被释放;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值