小議服務程式與會話(三)
共享模式探究
相對於專用模式,共享模式多了Dispatcher元件,還有在Dispatcher下管理的Server Process。
為了進行試驗,筆者已經將wilson資料庫轉換為共享連線模式。
SQL> conn as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as SYS
SQL> show parameter shared_servers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_servers integer 2
在共享模式下,Shared_servers是一個重要引數,當為非零的時候,表示系統正處在shared連線模式下。
首先,我們已經透過PL/SQL Developer登入(開啟兩個command視窗),根據我們之前的討論,應該有兩個連線會話與Server對應。我們首先檢視作業系統層面。
//本段程式碼無任何省略
[oracle@oracle11g ~]$ ps -ef | grep ora | grep -v grep
root 4868 1 0 08:10 ? 00:00:00 login -- oracle
root 5539 5507 0 08:25 pts/0 00:00:00 su oracle
oracle 5540 5539 0 08:25 pts/0 00:00:00 bash
oracle 6477 4868 0 09:26 tty1 00:00:00 -bash
oracle 6997 1 0 09:29 ? 00:00:00 /u01/oracle/bin/tnslsnr LISTENER -inherit
oracle 7028 1 0 09:29 ? 00:00:00 ora_pmon_wilson
oracle 7030 1 0 09:29 ? 00:00:00 ora_vktm_wilson
oracle 7034 1 0 09:29 ? 00:00:00 ora_gen0_wilson
oracle 7036 1 0 09:29 ? 00:00:00 ora_diag_wilson
oracle 7038 1 0 09:29 ? 00:00:00 ora_dbrm_wilson
oracle 7040 1 0 09:29 ? 00:00:00 ora_psp0_wilson
oracle 7042 1 0 09:29 ? 00:00:01 ora_dia0_wilson
oracle 7044 1 0 09:29 ? 00:00:00 ora_mman_wilson
oracle 7046 1 0 09:29 ? 00:00:00 ora_dbw0_wilson
oracle 7048 1 0 09:29 ? 00:00:00 ora_lgwr_wilson
oracle 7050 1 0 09:29 ? 00:00:01 ora_ckpt_wilson
oracle 7052 1 0 09:29 ? 00:00:01 ora_smon_wilson
oracle 7054 1 0 09:29 ? 00:00:00 ora_reco_wilson
oracle 7056 1 0 09:29 ? 00:00:03 ora_mmon_wilson
oracle 7058 1 0 09:29 ? 00:00:02 ora_mmnl_wilson
oracle 7060 1 0 09:29 ? 00:00:01 ora_d000_wilson
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7106 1 0 09:29 ? 00:00:00 ora_qmnc_wilson
oracle 7123 1 0 09:30 ? 00:00:02 ora_cjq0_wilson
oracle 7129 1 0 09:30 ? 00:00:00 ora_q000_wilson
oracle 7131 1 0 09:30 ? 00:00:00 ora_q001_wilson
oracle 7202 1 0 09:36 ? 00:00:00 ora_smco_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
oracle 7359 1 0 10:06 ? 00:00:00 ora_w000_wilson
oracle 7425 1 0 10:18 ? 00:00:00 ora_s002_wilson
oracle 7426 5540 0 10:19 pts/0 00:00:00 ps -ef
問題來了,我們登入了,為什麼之前的oraclewilson的服務連線沒有了。。。那麼,會話方面呢?
SQL> select saddr,sid,paddr,action from v$session where username='SYS';
SADDR SID PADDR ACTION
-------- ---------- -------- --------------------------------
382A5CA4 29 38BC20AC Main session
3829DD60 32 38BC4C0C Command Window - New
38298888 34 38BC8D1C Command Window – New
會話方面和我們之前的研究一樣,Developer中開啟兩個視窗,形成三個會話。關注的是PADDR(38BC20AC、38BC4C0C、38BC8D1C)地址。
我們檢查V$process檢視,檢視是否有PADDR為這三個的Process。
SQL> select addr, spid, pname, program from v$process where addr in ('38BC20AC','38BC4C0C','38BC8D1C');
ADDR SPID PNAME PROGRAM
-------- ------------------------ ----- ------------------------------------------------
38BC20AC 7062 S000 oracle@oracle11g (S000)
38BC4C0C 7349 S001 oracle@oracle11g (S001)
38BC8D1C 7425 S002 oracle@oracle11g (S002)
發現,三個對應地址的程式是一系列SXXX的程式,難道這就是我們在共享模式下的Server Process嗎?
Oracle檢視中,有v$shared_server檢視,名字上看就是共享模式下共享的Server檢視檢視。
SQL> select name,paddr, status from v$shared_server;
NAME PADDR STATUS
---- -------- ----------------
S000 38BC20AC WAIT(RECEIVE)
S001 38BC4C0C EXEC
S002 38BC8D1C WAIT(RECEIVE)
程式名稱和地址均相同,看來在共享模式下,Server Process的名稱均為SXXX(XXX為序號)。回顧剛才在ps –ef的檢索,也可以定位到這些程式。
在基礎知識中,我們說共享模式下有一個dispatcher元件,負責各個server process的分發管理,在ps –ef中是哪個呢?
我們先利用Oracle提供的檢視v$dispatcher。
SQL> select name,network,paddr,status from v$dispatcher;
NAME NETWORK PADDR STATUS
---- -------------------------------------------------------------------------------- -------- ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=oracle11g)(PORT=33522)) 38BC15D4 WAIT
同樣思路,Dispatcher程式的名字為DXXX(XXX表示序號),也在PADDR=38BC15D4中找到了作業系統的程式。
SQL> select addr, spid, pname, program from v$process where addr='38BC15D4';
ADDR SPID PNAME PROGRAM
-------- ------------------------ ----- ------------------------------------------------
38BC15D4 7060 D000 oracle@oracle11g (D000)
作業系統層面
[oracle@oracle11g ~]$ ps -ef | grep 7060 | grep -v grep
oracle 7060 1 0 09:29 ? 00:00:01 ora_d000_wilson
果然定位到了分發dispatcher程式和管理下的Server Process。
最後一個問題,共享模式下,當我們斷開了連線,Server Process會釋放嗎?
我們關閉了Developer程式,呼叫OS命令。
//第一次呼叫
[oracle@oracle11g ~]$ ps -ef | grep ora_s00
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
oracle 7425 1 0 10:18 ? 00:00:00 ora_s002_wilson
oracle 7488 5540 0 10:29 pts/0 00:00:00 grep ora_s00
//第二次呼叫
[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
//第三次呼叫
[oracle@oracle11g ~]$ ps -ef | grep ora_s00 | grep -v grep
oracle 7062 1 0 09:29 ? 00:00:05 ora_s000_wilson
oracle 7349 1 0 10:05 ? 00:00:06 ora_s001_wilson
發現,我們斷開了連線,關閉了Developer。在專用模式下,Server Process應當被釋放掉。但是我們發現,第一次呼叫的時候,對應原來的三個Server Process(S000、S001和S002)依然存在。片刻之後,第二次呼叫,發現S002被釋放掉了。再片刻之後,第三次呼叫,發現兩個S000和S001不會釋放掉,一直在執行。
結論:上面已經可以清楚的看到共享模式工作的原理。
首先,我們說的共享,是Server Process可以在不同時間為多個會話服務。在一個時刻,只能為一個會話服務!當會話結束的時候,Server Process是可以不釋放的。他的生命週期是透過Dispatcher來控制排程;
系統中保留多少個Server Process供Dispatcher排程,是初始化引數Shared_Server來確定。當請求數多於可以使用Shared_Server的時候,Dispatcher會自己安排建立新的Server Process,當然這是很消耗資源的。當請求數少於Shared_Server的時候,Dispather也會保留這個數目的連線數量。
那麼,Shared_Server設定為多少合適呢?這個是一個經驗加現實的解決。如果系統確定使用共享連線的Oracle配置(注意這個前提),要根據系統特性和實際併發使用者數目來估算合適的Shared_Server,並且在生產環境不斷的監控和調整。過多的額外Server建立,是可能引起系統Hange死的原因。
對Shared模式的見解
現在使用共享模式的應用是比較少的。因為在配置上存在一些困難問題,以及對效能擴充的缺陷,一些資料和專家們都建議不要設定共享模式。
專用模式和共享模式是Oracle早期提出的兩種典型連線方式,分別是應對不同的資料庫連線需求。
一般認為,資料庫連線是一種珍貴的系統資源,建立和銷燬都是很大的損耗。如果前端應用過於頻繁的請求連線和釋放連線,對應用系統整體和資料庫都是很大的效能問題。比如早期的ASP、JSP頁面應用,業務邏輯和資料庫訪問都在頁面上。基於這種考慮,才出現的共享模式。
但是隨著兩個趨勢,共享模式的重要性逐漸降低。第一個是專用模式的不斷最佳化,雖然每個連線都要對應一個專用的Server Process,而且用後立即釋放。但是Oracle對於這部分的最佳化力度也在加強,大量的Server Process建立和釋放不存在過多的效能問題。相對應的是共享模式在會話資料儲存、私有空間存在一些不能迴避的問題。而且共享模式擴充性受到引數約束很大。
另一個趨勢就是企業級軟體實踐的推進。J2EE、.NET為代表,各種開源框架為先鋒的軟體風潮,給我們提供了一些解決問題的思路和方法。連線池、中介軟體的思路和產品,為企業級應用提供了穩定可靠的資料庫連線保證和重用保證。在資料庫層面實現的連線共享,已經可以方便的在應用層面加以實現。
在一些資料中,甚至提出了Oracle連線模式的第三種模式,就是shared pool方式。藉助Oracle提供的中介軟體產品或者第三方的中介軟體產品,專用模式下的資料庫對外還可以提供高併發、多使用者的連線實現。
綜合上述內容:筆者還是建議儘可能將共享連線模式實現在應用層面,不要輕易的選擇資料庫的共享連線模式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-683641/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小議服務程式與會話(一)會話
- 小議服務程式與會話(二)會話
- 事務複製會話 (三)會話
- 微信小程式服務推送微信小程式
- 搭建微信小程式服務微信小程式
- 第三次小組站立會議
- ASP.Net Web 服務 – 如何使用會話狀態ASP.NETWeb會話
- 部分金融類小程式已被證監會叫停 卻仍在服務
- 特靈空調售後服務電話(全國24小時客服服務熱線)
- php 小程式服務商支付模式PHP模式
- Node服務下的微信小程式微信小程式
- 微信小程式遇見容器服務微信小程式
- springcloud(三):服務提供與呼叫SpringGCCloud
- WebSocket實現服務端推送訊息和聊天會話Web服務端會話
- 如何開發同城生活服務小程式?
- oracle中國服務電話Oracle
- 如何實現在服務端錄製視訊會議?服務端
- ORACLE會話連線程式三者總結Oracle會話線程
- [服務端與網路]http協議與http狀態碼服務端HTTP協議
- 會話與事務級臨時表和dual表會話
- 三. SpringCloud服務註冊與發現SpringGCCloud
- Android Service 服務(三)—— bindService與remoteServiceAndroidREM
- Choerodon 的微服務之路(三):服務註冊與發現微服務
- mysql鎖與會話MySql會話
- Cookies與會話物件Cookie會話物件
- 三菱空調全國官方售後服務電話24小時(三菱統一客服熱線號碼)
- 【開源】多多客小程式-微信小程式SaaS平臺原始碼-微信第三方服務商必備微信小程式原始碼
- WCF 服務應用程式與 服務庫之間的區別
- 事務複製會話 (二)會話
- 事務複製會話 (四)會話
- 事務複製會話 (五)會話
- 使用微信小程式連線到 MQTT 雲服務微信小程式MQQT
- 微信小程式新增外部地圖服務資料微信小程式地圖
- Thrift協議的服務模型協議模型
- soap協議的web服務協議Web
- SpringCloud 三種服務呼叫方式,你學會了嗎?SpringGCCloud
- 前端【小程式】14-小程式基礎篇【地理位置】【騰訊定位服務】前端
- WebService大講堂之Axis2(6):跨服務會話(Session)管理Web會話Session