小議服務程式與會話(二)

realkid4發表於2011-01-12

PL/SQL Developer連線解析

 

PL/SQL Developer是我們常常使用的開發工具。這個工具同時可以開啟多個視窗,每個視窗是一個獨立的會話,那麼其中的原理和過程是如何呢?我們一起來分析。

 

首先啟動一個Develper程式,開啟一個視窗。實現登入。

 

SQL> conn sys/sys@wilson as sysdba;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

 

 

注意,此時只開啟了一個視窗,可見的只有一個會話物件!!

 

SQL> select sid, serial#, paddr, user#, username, machine, action from v$session where username='SYS';

 

SID    SERIAL# PADDR  USER# USERNAME      MACHINE  ACTION

-------- ---------- ------------------------------ ----------------------------------------------------------------

33      10    38BC4C0C       0       SYS      {本機名}   Main session

37      13    38BC56E4        0      SYS       {本機名}    Command Window  -  New

//說明:版式原因,將本機名簡寫;

 

出現了一些問題,我們只開啟了一個視窗command window。但在會話檢視中,我們卻發現了兩個會話。一個是command window,另一個是Main session

 

檢視v$process,可以發現。

//篇幅原因,簡寫

SQL> select * from v$process where pname is null;

 

ADDR            PID SPID                   

-------- ---------- -------------------

38BC4C0C         22 5730                     

38BC56E4         23 5734          

 

兩個會話,在v$process中對應的是兩個process,分別的SPID57305734

 

那麼,從Linux程式列表中,如何情況呢?

 

[oracle@oracle11g ~]$ ps -ef | grep ora

……(篇幅原因,省略)

oracle    5720     1  0 10:41 ?        00:00:00 ora_w000_wilson

oracle    5730     1  1 10:42 ?        00:00:02 oraclewilson (LOCAL=NO)

oracle    5734     1  0 10:42 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5747  5515  0 10:45 pts/0    00:00:00 ps -ef

oracle    5748  5515  0 10:45 pts/0    00:00:00 grep ora

果然,存在PID57305734的兩個程式對應。

 

結論:當我們在Develper中,只開啟一個視窗的時候,是有兩個session存在的,並且與兩個server process相對應。

 

當我們再開啟一個command視窗(原有視窗不關閉)。

 

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

 

會話情況。

 

SQL> select sid, serial#, paddr, user#, username, machine, action from v$session where username='SYS';

 

SID        PADDR           USERNAME   MACHINE           ACTION

---------- ---------- -------- ---------- ------------------------

33         38BC4C0C         SYS        {本機}          Main session

37         38BC56E4         SYS         {本機}          Command Window - New

39         38BC61BC        SYS         {本機}          Command Window – New

 

增加了一個視窗,在會話層面上新增加了一個會話(SID=39)。此外,Process層面。

 

SQL> select * from v$process;

//有省略結果

ADDR            PID SPID  

---------- ------------------------------ ---------

38BC4C0C         22 5730   

38BC56E4         23 5734   

38BC61BC         24 5756   

 

 

程式對應的地址,完全相同,說明有三個process與其對應。

 

作業系統層面。

 

[oracle@oracle11g ~]$ ps -ef | grep ora

……(篇幅原因,有省略結果)

oracle    5730     1  0 10:42 ?        00:00:02 oraclewilson (LOCAL=NO)

oracle    5734     1  0 10:42 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5756     1  0 10:46 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5762  5515  0 10:47 pts/0    00:00:00 grep ora

 

結論:當新增加一個command視窗之後,是有一個新會話生成,同時一個新的server process出現與其對應。

 

這次我們關閉了所有的視窗,只保留一個空的Develper介面。

 

SQL> select sid, serial#, paddr,machine,action from v$session where username='SYS';

 

       SID    SERIAL# PADDR      MACHINE                      ACTION

---------- ---------- ------------------------------------    -----------------------------------

        28         71 38BC56E4   WORKGROUP\WWW-0E6111DFF74  //觀察程式

        33         10 38BC4C0C   WORKGROUP\WWW-0E6111DFF74    Main session

 

 

只有一個Main Session的介面存在。

 

[oracle@oracle11g ~]$ ps -ef | grep ora

。。。(篇幅原因,有省略)

oracle    5730     1  0 10:42 ?        00:00:02 oraclewilson (LOCAL=NO) //這個是Main Session對應的程式,因為PID編號一直保留為5730

oracle    5791     1  0 10:51 ?        00:00:00 ora_w000_wilson

oracle    5809     1  0 10:55 ?        00:00:00 oraclewilson (LOCAL=NO)

oracle    5821     1  9 10:58 ?        00:00:00 ora_j000_wilson

oracle    5823     1  0 10:58 ?        00:00:00 ora_j001_wilson

oracle    5824  5515  0 10:58 pts/0    00:00:00 ps -ef

oracle    5825  5515  0 10:58 pts/0    00:00:00 grep ora

 

 

當關閉developer之後,

[oracle@oracle11g ~]$ ps -ef | grep ora

(有省略)

oracle    5676     1  0 10:36 ?        00:00:00 ora_q001_wilson

oracle    5718     1  0 10:41 ?        00:00:00 ora_smco_wilson

oracle    5791     1  0 10:51 ?        00:00:00 ora_w000_wilson

oracle    5826  5515  1 10:58 pts/0    00:00:00 ps -ef

oracle    5827  5515  0 10:58 pts/0    00:00:00 grep ora

 

分析和結論:

 

在分析之前,我們先關注一個細節。當我們在Developer中開啟視窗的時候,如果我們當前是已經登入的,是不需要再輸入使用者名稱和密碼的。而在我們命令列的視窗頭行,會有如下資訊:

 

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as SYS

 

細心的朋友們會意識到,這段提示實際上是我們新連線到一個Oracle例項的時候,會出現的資訊。說明我們在新開一個視窗的時候,雖然沒有輸入使用者名稱資訊,但是還是算一次登入。那麼問題來了,究竟是誰在什麼時候替我們輸入了呢?

 

第二個細節,每個Developer程式,只能是一個使用者在登入。比如,我開啟5command視窗,只要我在一個視窗中重新登入。那麼其他所有的視窗的使用者資訊都是被重新整理為新的使用者,當然,會話也全部為新的。

 

結論:畢竟我們不是Developer的開發者,只能依據事實進行合理猜測。

 

1、  Developer主程式,實際上是一個Main SessionOracle連線。只要Developer不是在nologing的狀態,就會有一個會話與資料庫伺服器相連。這個會話像一個火種,儲存著當前Developer的登入使用者資訊。在專有連線模式下,這個Main Session也是有Server Process與其連線;

2、  當我們新建立一個視窗的時候,Developer會利用Main Session的資訊,自動完成與監聽器溝通、連線重定向和與新Server Process溝通的作用。讓我們新開啟一個視窗,不需要做任何額外的工作。本質上,一個視窗,就對應的一個會話。專有模式下,也就對應的一個Server Process

3、  當我們在任何一個視窗中重新登入的時候,Developer會將這個連線資訊(連線使用者、密碼和連線服務名)作為Main Session的一個替代品,替代Main Session原有的資訊。並且為每一個視窗,重新建立會話,形成與Server Process的通訊。在專有模式下,對應的Server Process是新生成的;

 

 

那麼,在共享模式下,我們研究的又是如何呢??

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

相關文章