查看僵死进程(process参数大于session,一个process可能对应1个或多个session)
select * from v$process where addr not in (select paddr from v$session) and pid not in (1,17,18)
Dead connections:死连接(处理方法SQLNET.EXPIRE_TIME)
These are previously valid connections with the database but the connection between the client and server processes has terminate abnormally.有些之前合法的连接,但是由于客户端和服务器进程的异常中断,这种情况下,后台进程跑在服务器端,而会话在数据库端不会中断。当死连接启动,NET8(服务端)会发送一个包到客户端。如果客户端是活动的,这个包就被丢掉。如果客户端已经被中断,服务器端将接收一个错误,将会中断该会话。
INACTIVE Sessions:不活动会话(处理方法profile.IDLE_TIME)
These are sessions that remain connected to the database with a status in v$session of INACTIVE.
用户开始一个会话,运行一段时间后,保持相当一段时间的空闲。会话与服务器端保持连接,但是状态为inactive.
DCD的具体原理:
DCD是Dead Connection Detectio缩写,当一个新的数据库连接建立后,SQL*Net读取参数文件的SQLNET.EXPIRE_TIME设置(如果设置了的话),在服务端初始化DCD,DCD会为这个连接创建一个定时器,当该定时器超过SQLNET.EXPIRE_TIME指定时间间隔后,就会向客户端发送一个probe package(侦测包),该包实质上是一个空的SQL*NET包,不包括任何有用数据,它仅在底层协议上创建了数据流。如果此时客户端连接还是正常的话,那么这个probe package就会被客户端直接丢弃,然后Oracle服务器就会把该连接对应的定时器重新复位。如果客户异常退出的话,侦测包由客户端的IP层交到TCP层时,就会发现原先的连接已经不存在了,然后TCP层就会返回错误信息,该信息被ORACLE服务端接收到后,ORACLE就会知道该连接已经不可用了,于是SQL*NET就会向操作系统发送消息,释放该连接的相关资源。