登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SeaRiver Blog

实力才是你一生最好的依靠!

 
 
 

日志

 
 

pconnect与connect  

2007-03-12 14:38:30|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

經驗談


 在建立資料庫連線時,除了上述的 mysql_connect( ) 以外,您也可以使用 mysql_pconnect( ) 來建立一個持續性的連線(persistent connection)。

 用 mysql_connect( ) 建立的連線,用完即丟,乾淨俐落。不過,因為在建立資料庫連線時,需要耗費一些時間與系統資源;若使用「持續連線」的話,同一部 web server 再向 MySQL server 請求連線時,可以直接使用先前用完閒置的連線,而不必重建。所以使用 mysql_pconnect( ) 來建立連線,可以節省時間,同時也能降低伺服器的負擔。

 兩者相較之下,mysql_pconnect( ) 顯然好得多,以後我們都使用它就好了。一般而言,這樣的說法是對的,坊間的相關書籍幾乎都支持這個論點;但我覺得它不完全正確,也就是說:在某些場合,mysql_pconnect( ) 是不適用的。

 

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


狀況一:

 使用 1 部 web server 與 1 部 MySQL server(兩者可能同在一部主機上),而 web server 固定只對 MySQL server 上的某一個資料庫進行存取動作。

 因為每次存取資料庫時,都是由 web 那邊使用同一帳號對 MySQL 上的同一資料庫作業,若我們將 MySQL 與 web server 的「同時連線數」都調整為 200,就好像 MySQL 這邊一直有 200 位「服務生」,隨時等著接待來自 web 的 200 位「顧客」似的。而且「顧客」離開之後,「服務生」也不下場休息,時時都站在門口等著接待下一個「顧客」。

 在這種情況下,您只要注意將 MySQL 的「同時連線數」調得比 web server 的高或相等,就會發現使用 mysql_pconnect( ) 是個不錯的選擇。

 

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


狀況二:

 使用 1 部 web server 與 1 部 MySQL server(兩者可能同在一部主機上),而 web server 會對 MySQL server 上的兩個資料庫進行存取動作。

 從 web server 那邊提出資料存取需求時,有時是針對第 1 個資料庫(DB1),有時則是針對第 2 個資料庫(DB2)。若我們也將 MySQL 與 web server 的「同時連線數」都調整為 200,這樣一來,就好像 MySQL 這邊有 200 位「服務生」,但同時經營兩個「吧台」(DB1 與 DB2),而「顧客」可能多達 200 位。

 一開始,DB1 這個「吧台」比較熱門,MySQL 派了 150 位「服務生」上場接待;同樣地,當「顧客」離開之後,這 150 位「服務生」仍守著 DB1 而不下場休息。後來,DB2 那邊也熱鬧起來了,「顧客」越來越多,MySQL 得加派「服務生」上場,有幾個能派?答案是 50 個!

 為什麼「服務生」的人力調配會捉襟見肘?那是因為 web 那邊使用了 mysql_pconnect( ) 來建立連線。「服務生」一開始被指定到哪個「吧台」工作,就會持續在那邊停留,絕不「轉台」。

 

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


 請注意,當使用持續性的連線時,每個已建立的連線只為來自同一部 web server、使用同一組帳號,且存取同一資料庫的使用者服務。

 如此一來,假設每部 web server 的「同時連線數」都是 200,而且同時使用 2 部 web server 會怎麼樣呢?從 web1 來了 50 個「顧客」,先是到 DB1 走一趟,接著再到 DB2 晃一圈,這樣需要多少「服務生」接待他們?100 個(web1->DB1: 50 web1->DB2: 50)!又從 web2 來了 50 個「顧客」,也做了同樣的動作(web2->DB1: 50 web2->DB2: 50)。在此之後,還有「服務生」是閒著的嗎?後續若從 web1 或 web2 同時湧入多於 50 位「顧客」時,誰來應付他們?

 倘若您使用的是像 Apache 這類的 multi-process web server(一個 parent process 協調一組 children processes 運作),某個 children process 建立的「持續連線」,是不能分享給其它 children process 來使用的(「服務生」只對先前接待過的「顧客」服務)。在這樣的情況下,將會使得 MySQL 上閒置的 process 越積越多(很多「服務生」站在門口等著「老顧客」上門,而不理會「新顧客」)。

 mysql_pconnect( ) 一定是最佳選擇嗎?我想未必盡然。

 

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


說明:

 「同時連線數」是有上限的,當所有連線都被佔用時,後續的連線要求就會被拒絕。「同時連線數」能調整到多高,這與伺服器本身的效能是息息相關的,因為調得愈高,所消耗的系統資源也就愈多。

  评论这张
 
阅读(475)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018