標籤:oracle connection session
串連並不是會話的同義字,在一條串連上可以建立0個、一個或多個會話。各個會話是單獨而且獨立的,即使它們共用同一條資料庫物理串連也是如此。一個會話中的提交不會影響該串連上的任何其他會話。實際上,一條串連上的各個會話可以使用不同的使用者身份!
在Oracle中,串連只是客戶進程和資料庫執行個體之間的一條特殊線路,最常見的就是網路連接。這條串連可能串連到一個專用伺服器處理序,也可能串連到發送器。如前所述,串連上可以有0個或多個會話,這說明可以有串連而無相應的會話。另外 ,一個會話可以有串連也可以沒有串連。使用進階Oracle Net特性(如串連池)時,客戶可以刪除一條物理串連,而會話依然保留(但是會話會空閑)。客戶在這個會話執行某個操作時,它會重建立立物理串連。
串連(connection):串連是從客戶到Oracle執行個體的一條實體路徑。串連可以在網路上建立或通過IPC機制建立。通常會在客戶進程與一個專用伺服器或一個發送器之間建立串連。不過,如果使用Oracle的連線管理員(ConnectionManager,CMAN),還可以在客戶和CMAN之間以及CMAN和資料庫之間建立串連。
會話(session):會話是執行個體中存在的一個邏輯實體。這就是工作階段狀態(session state),也就是表示特定會話的一組記憶體中的資料結構。提到“資料庫連接”時,大多數人首先想到的就是“會話”。你要在伺服器中的會話上執行SQL、提交事務或運行預存程序。
可以使用SQL*Plus來看一看實際串連和會話是什麼樣子,還可以瞭解到,實際上一條串連有多個會話的情況相當常見。這個使用AUTOTRACE命令,進行測試。
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M01/8C/7A/wKioL1ht8_uxF1w6AAAhZJBWda4789.png" title="1.png" alt="wKioL1ht8_uxF1w6AAAhZJBWda4789.png" />
這說明現在有一個會話:這是一個與單一專用伺服器串連的會話。以上PADDR列是這個專用伺服器處理序的地址。下面,只需開啟AUTOTRACE來查看SQL*Plus中所執行語句的統計結果:
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8C/7A/wKioL1ht9BLhfntcAABKi7J9AXI310.png" title="2.png" alt="wKioL1ht9BLhfntcAABKi7J9AXI310.png" />
這樣一來,我們就有了兩個會話,但是這兩個會話都使用同一個專用伺服器處理序,從它們都有同樣的PADDR值就能看出這一點。從作業系統也可以得到確認,因為沒有建立新的進程,對這兩個會話使用了一個進程(一條串連)。需要注意,其中一個會話(原來的會話)是ACTIVE(活動的)。這是有道理的:它正在執行查詢來顯示這個資訊,所以它當然是活動的。但是這個INACTIVE(不活動的)會話呢?那個會話要做什嗎?這就是AUTOTRACE會話,它的任務是“監視”我們的實際會話,並報告它做了什麼。
在SQL*Plus中啟用(開啟)AUTOTRACE時,如果我們執行DML操作(INSERT、UPDATE、DELETE、SELECT和MERGE),SQL*Plus會完成以下動作:
(1)如果還不存在輔助會話,它會使用當前串連建立一個新會話。
(2)要求這個新會話查詢V$SESSATE視圖來記住實際會話(即運行DML的會話)的初始統計值。
(3)在原會話中運行DML操作。
(4)DML語句執行結束後,SQL*Plus會請求另外那個會話(即“監視”會話)重新查詢V$SESSTAT,並產生前面所示的報告,顯示出原會話(執行DML的會話)的統計結果之差。
如果關閉AUTOTRACE,SQL*Plus會終止這個額外的會話,在V$SESSION中將無法看到這個會話。之所以要另建一個額外的會話,原因是:如果在同一個會話中觀察統計結果,就會造成影響,因為執行監視本身也要使用記憶體、I/O,網路上傳輸位元組以及執行排序。所以需要使用另一個會話來正確測量。
到目前為止,我們已經看到一條串連可以有一個或兩個會話。現在,我們使用SQL*Plus來查看一條沒有任何會話的串連。只需要鍵入一個“很容易誤解”的命令DISCONNECT:
650) this.width=650;" src="https://s2.51cto.com/wyfs02/M02/8C/7A/wKioL1ht9CHC0PYNAAAVqKdVveg184.png" title="2.5.png" alt="wKioL1ht9CHC0PYNAAAVqKdVveg184.png" />
從技術上講,這個命令應該叫DESTROY_ALL_SESSIONS更合適,而不是DISCONNECT,因為我們並沒有真正物理的中斷連線。要真正的中斷連線,應該執行exit命令。
使用另一個使用者開啟另一個會話,查詢原來賬戶名的會話:
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M00/8C/7D/wKiom1ht9DGwIlskAAAPWFF2954455.png" title="3.png" alt="wKiom1ht9DGwIlskAAAPWFF2954455.png" />
可以看到,這個賬戶名下沒有會話,但是仍有一個進程,相應地有一條物理串連(使用前面的ADDR值):
650) this.width=650;" src="https://s3.51cto.com/wyfs02/M00/8C/7A/wKioL1ht9D7h-sxDAAAXYSzNJCs137.png" title="4.png" alt="wKioL1ht9D7h-sxDAAAXYSzNJCs137.png" />
所以,這就有了一條沒有相關會話的“串連”。可以使用CONNECT命令(這個命令的名字也起得不恰當),在這個現有的進程中建立一個新的會話(CONNECT命令叫CREATE_SESSION更合適)。使用取消串連的SQL*Plus,執行以下內容:
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8C/7D/wKiom1ht9E3RYu8bAAAeTFw_ncw648.png" title="5.png" alt="wKiom1ht9E3RYu8bAAAeTFw_ncw648.png" />
可以注意到,PADDR還是一樣的,所以我們還是使用同一條物理串連,但是(可能)有一個不同的SID。說“有可能”是因為也許還會分配同樣的SID,這取決於我們登出時是否有別人登入,以及我們原來的SID是否可用。
參考《9I10G11G編程藝術 深入資料庫體繫結構》
本文出自 “DBA Fighting!” 部落格,請務必保留此出處http://hbxztc.blog.51cto.com/1587495/1889332
Oracle的串連與會話