調優之淺析“會話管理開銷”
【簡介】
在調優的過程中,對於會話的管理是比較普遍的問題,因為維護會話的開銷相對是比較高的。
【過程表現如下】
客戶請求(sid)→監聽接收到→監聽派生出新的進程(systemprocess id)→客戶進程
注釋:
SPID:system process id,表示該serverprocess在OS層面的Process ID(操作系統進程ID);
PID:oracle process id,可以理解為Oracle自身使用的進程ID;
SID:session標識,在連接其它列時使用
【操作過程】
SQL> select sid from v$mystat whererownum=1;
--當前會話的sid
SID
----------
159
SQL> select p.spid
2 from v$process p,v$session s
3 where p.addr=s.paddr ands.sid=159;
--通過sid(session標識)找到相應的serverprocess
--spid(system process id)serverprocess在OS層面的Porcess ID,即操作系統進程ID
--pid(oracle process id)oracle進程ID
--查詢條件為進程地址等於會話裡的進程地址,並且會話sid為159
--查詢出為sid159服務的system processid為426192
SPID
------------
426192
$ps -ef |grep 426192|grep -v grep
--查看system process id(serverprocess id)為426192的進程,並且把grep進程本身排除掉
oracle 426192 303338 0 09:29:21 - 0:02 oraclemetro (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
--查看到spid為426192的oracle進程,這是一個專有模式連接的進程
--以上查詢表明維護一個會話的開銷是比較高的
【情景舉例】
假設操作人員登陸一個系統時,會將sql發送給應用服務器,符合驗證後會反饋回來,此時數據庫鏈接斷掉。一段時間後操作人員想根據ID查詢相應數據時,會重新發送一個鏈接,這次把信息返回後,又會斷掉。這就是一個比較糟糕的會話鏈接,循環往復,因為在不停的創建鏈接、終結鏈接、創建鏈接、終結鏈接......將這種情況體現在oracle上面,成本就會比較高了。
在實際生產環境下,對於應用服務器(B\S結構)會建立長鏈接(或鏈接池)以解決前面的問題。比如說,以weblogic作為應用服務器,創建了許多鏈接對象連接到oracle數據庫,連上以後就不再斷開了。之後,前端的應用需要使用數據庫的時候,會先連接到應用服務器,應用服務器分配一個鏈接池裡的空閒鏈接給這個應用請求使用。這個鏈接用完之後不會中斷,而是把它變成空閒的狀態再放回鏈接池。這個過程就是有效的減少了會話的數量。