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分钟后再查看,旧连接将被释放;
主要用于客户端因异常与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分钟后再查看,旧连接将被释放;
相关文章推荐
- ora-01033:oracle initialization or shutdown in progress 解决方法
- Oracle 中如何判断时间类型Date是否为空
- oracle database link使用说明
- CentOS 6.4上安装Oracle 11.2
- 连接Oracle 10g本地服务 时ORA-12514 , ORA-12519:
- OracleEnterpriseLinux上搭建samba服务器
- JDBC and Oracle conn.commit and conn.setAutocommit not working properly
- Step by step Install Oracle 11gR2(11.2.0.4.0) RAC+Active DataGuard on Oracle Enterprise Linux(OEL6.3X86_64)
- Spotlight on oracle 使用
- VS2010中无System.Data.OracleClient引用的问题
- Oracle 11g存在密码过期问题
- JAVA通过JDBC连接Oracle数据…
- Oracle用户表空间查看、修改…
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 说说Oracle索引的原理(面试题)
- Oracle database启动过程分析
- 45 个非常有用的 Oracle 查询语句
- 用java调用oracle存储过程总结
- oracle 11g stream
- Oracle中Hint深入理解