死連線或不活動會話_DB處理機制

lusklusklusk發表於2017-02-27
檢視僵死程式(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就會向作業系統傳送訊息,釋放該連線的相關資源。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2134380/,如需轉載,請註明出處,否則將追究法律責任。

相關文章