oracle的會話。會話與連接詳解


connect 物理連接,網絡或者本地
session 實例中的一個邏輯實體
有連接就有會話

select serail#,sid,username from v$session where username is null;

 

四種連接:

1、無連接無會話無進程: sqlplus /nolog;
2、單個連接單個會話單個進程: sqlplus/ as sysdba;
3、無會話有進程: 兩個用戶連接,一個用戶disconnect。disconnect會話斷開,連接不斷開

通過連接進程號推出用戶
desc v$process
select ADDR from v$process where SPID='linux連接進程'
select serail#,sid,username from v$session where paddr='上句查詢的ADDR'
如果nows selected 可以kill

4、單個連接但是有多個會話set autotrace on
set autotrace off
總結:必須先建立連接,才可以再建立會話,會話建立以后用戶才可以執行sql語句


用PL/SQL連接一個用戶數據庫,並執行sql:
select username,sid,serial#,server,paddr,status from v$session where username=USER --USER是系統函數,結果為當前連接數據庫的用戶。
結果如下:
username sid serial server paddr status
VSESSION 5546 40741 DEDICATED 00000018E1898048 INACTIVE
VSESSION 6208 40561 DEDICATED 00000018919221F0 ACTIVE
可以看到有兩個會話,而第一個會話是inactive。再執行
select * from v$session where username='VSESSION'
觀察得第一個會話的ACTION字段為primary Session 為初級會話,執行sql時初級會話已不再活動

反而關閉PL/SQL重新連接到該用戶,不執行sql,在sqlplus連接到用戶,在sqlplus中查詢:
SQL> select username,sid,serial#,server,paddr,status from v$session where username=USER;

USERNAME SID SERIAL# SERVER PADDR
------------------------------ ---------- ---------- --------- ----------------
STATUS
--------
VSESSION 5546 41769 DEDICATED 00000018E1898048
INACTIVE

VSESSION 6208 41647 DEDICATED 00000018919221F0
還是會看到初級連接

我們把連接數提升到四個:
現在已經有兩個了
第三個:
在sqlplus中執行:
SQL> set autotrace on statistics
SQL> select username,sid,serial#,server,paddr,status from v$session where username=USER;

USERNAME SID SERIAL# SERVER PADDR
------------------------------ ---------- ---------- --------- ----------------
STATUS
--------
VSESSION 5546 41769 DEDICATED 00000018E1898048
INACTIVE

VSESSION 6206 37273 DEDICATED 00000018919221F0
INACTIVE

VSESSION 6208 41647 DEDICATED 00000018919221F0
ACTIVE

 

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
1024 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
第四個:
在PL/SQL中開一個sql窗口,執行
select username,sid,serial#,server,paddr,status from v$session where username=USER;
USERNAME SID SERIAL# SERVER PADDR status
VSESSION 1455 15843 DEDICATED 00000018B18949C0 ACTIVE
VSESSION 5546 41769 DEDICATED 00000018E1898048 INACTIVE
VSESSION 6206 37273 DEDICATED 00000018919221F0 INACTIVE
VSESSION 6208 41647 DEDICATED 00000018919221F0 INACTIVE
這四個會話中, 第一個是plsql的初級會話(連接上后的初級會話)
第二個是plsql的開sql窗口后執行sql的會話
第三個是sqlplus中用戶執行語句的會話
第四個是sqlplus中用戶執行執行計划統計信息收集的會話


總結:有連接就有會話
plsql連接到數據庫是一個會話
開個sql窗口又使一條會話
選擇sql語句按F5查看執行計划又是一個窗口,又是一條會話

---PL/SQL中每個窗口是一個會話,初始是一個
---sqlplus中dml是一個,set autotrace 是一個

*****
實際上,一個連接有多個會話是非常普遍的。使用SQL*Plus可以說明連接和會話間的區別。使用autotrace命令時可產生兩個會話。通過一個使用單個進程的連接也可以建立兩個會話。首先,執行以下操作。

SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/
USERNAME SID SERIAL#SERVER PADDR STATUS
----------- --- ------ ------ ------------ -----
OPS$TKYTE 153 3196 DEDICATED AE4CF614 ACTIVE

其中,user是系統函數,結果為當前連接數據庫的用戶。目前結果顯示的是一個單獨連接專用服務器的會話。PADDR列是唯一的專用服務器進程的地址。
其次,打開autotrace,來查看在SQL*Plus中執行語句的統計數據。

SQL>set autotrace on statistics
SQL>select username,sid,serial#,server,paddr,status
from v$session
where username=USER
/

這樣,就打開了兩個會話,但是兩者都使用一個專用服務器進程。查詢結果顯示它們都有相同的PADDR列值。因此,兩個會話使用一個進程,即單個連接。注意,其中一個會話,即最初的會話(SQL*Plus),是處於主動(active)狀態。該會話運行查詢顯示結果信息。但另外一個處於被動狀態(inactive)的會話就是autotrace會話,其職責是監視第一個會話並報告該會話所做的一切。
在SQL*Plus中打開autotrace后,當執行DML操作(insert、update、delete、select和merge)時,SQL*Plus將完成下列操作。
1)如果第二個會話不存在,則使用當前連接創建一個新的會話。
2)SQL*Plus要求產生的新會話查詢v$sesstat視圖,為運行DML的會話記錄初始統計數據。
3)在第一個會話中運行DML操作。
4)在完成DML語句后,SQL*Plus 將要求其他會話再次查詢V$sesstat並產生顯示執行DML會話在統計數據上的差異報告。
如果關閉autotrace,SQL*Plus將終止第二個會話並不再監視v$session視圖。










免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM