Oracle的串連與會話

來源:互聯網
上載者:User

標籤: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的串連與會話

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.