您的位置:首页 > 数据库 > Oracle

ORACLE DCD(dead connection detection)特性

2014-02-17 11:57 555 查看
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分钟后再查看,旧连接将被释放;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: