2008-09-08 149 views
42

我在項目中使用PHP的PDO層進行數據訪問,並且我一直在閱讀它,並且看到它對持久數據庫連接具有良好的固有支持。我想知道我是否應該使用它們。我會看到一個CRUD重型應用程序的性能優勢嗎?是否有缺點需要考慮,可能與安全有關?持久性數據庫連接 - 是或否?

如果對你很重要,我使用MySQL 5.x.

回答

58

您可以使用此作爲一個粗略的「規則集」:

YES,使用持久連接,如果:

  • 只有少數應用/用戶訪問數據庫,即你不會導致200個打開的(但可能是空閒的)連接,因爲在同一個主機上有200個不同的用戶共享。
  • 數據庫是,你是通過網絡訪問另一臺服務器上運行
  • 的(一個)應用程序訪問數據庫經常

NO,不使用持久連接,如果:

  • 您的應用程序只需要每小時訪問數據庫100次。
  • 您有許多網絡服務器訪問一個數據庫服務器
  • 您在prefork模式下使用Apache。它爲每個子進程使用一個連接,可以相當快速地進行。 (通過@Powerlord在評論中)

使用持久連接速度要快得多,特別是在通過網絡訪問數據庫時。如果數據庫運行在同一臺機器上,它並沒有太大的區別,但速度還是比較快。但是 - 正如名稱所述 - 連接是持久的,即保持打開狀態,即使未使用。

問題是,在「默認配置」中,MySQL只允許1000個並行「開放通道」。之後,新的連接被拒絕(你可以調整這個設置)。因此,如果您擁有20個Web服務器,每個客戶端上有100個客戶端,並且每個客戶端每小時只有一個頁面訪問權限,那麼簡單的數學計算將告訴您需要2000個並行連接到數據庫。這是行不通的。

錯誤:只能用於有很多請求的應用程序。

+1

另外,如果您在prefork模式下使用Apache,請勿使用持久連接。它爲每個子進程使用一個連接,可以相當快速地進行。 – Powerlord 2008-11-10 19:28:49

+0

@BlaM,我沒有得到你的最後一段。是否持久連接允許您重用它們(這就是整個重點?),所以您不需要2000個連接,因爲它們將被重用?或者你的意思是**每個客戶**都有一個唯一的用戶名?即便如此,當舊連接連接完成後,新連接將不會自動關閉? – Pacerier 2015-06-25 07:01:28

4

創建到數據庫的連接是一個相當昂貴的操作。持久連接是一個好主意。在ASP.Net和Java世界中,我們有「連接池」,這是大致相同的事情,也是一個好主意。

3

IMO,這個問題的真正答案是任何最適合你的應用程序。我建議你使用持久連接和非持久連接來測試你的應用程序。

Maggie Nelson @Objectively Oriented在八月份發佈了此消息,Robert Swarthout發表了一些帶有硬編號的附帶帖子。這兩個都很不錯。

+2

「客觀導向」鏈接已關閉。 – Pacerier 2015-06-25 07:23:37

+1

我不喜歡這個答案,因爲基準測試通常是以非常不準確的方式完成的。您的計算機在「除真實世界訪問模式之外」(這是典型的測試)訪問它時,它可能看起來非常好。時間安排非常重要,正如現實生活中經常發生的其他一些「難以複製」的情況一樣。除非你肯定會需要它,否則我會建議你仔細考慮並避免它。預優化是第一個罪。 – 2016-06-15 16:16:48

0

在我的愚見:

當使用PHP的Web開發,大部分的連接將只「活」的頁面的生命執行。持續的連接會花費你很多的開銷,因爲你必須把它放在會話或某些事情中。

99%的時間在頁面執行結束時死亡的單個非持續性連接將工作得很好。

其他1%的時間,你可能不應該使用PHP的應用程序,並沒有完美的解決方案。

0

我打算問同樣的問題,而不是再次問同樣的問題,我只是添加一些我發現的信息。

還值得一提的是,新的mysqli擴展甚至不包括使用持久的數據庫連接的選項。

我目前仍在使用persitent連接,但計劃在不久的將來切換到非持久連接。

0

一般來說,有時候需要使用非持久連接,並且很有必要將單個模式應用於db連接設計(只要在您的上下文中使用持久連接的可能性相對較小)。

9

簡而言之,我的經驗表明,儘可能避免長久連接。

請注意,mysql_close是使用mysql_pconnect創建的連接的無操作(無操作)。這意味着持久連接不能被客戶隨意關閉。當連接上沒有任何活動發生超過wait_timeout的連接時,mysqldb服務器將關閉此連接。如果wait_timeout是很大的值(比如30分鐘),那麼mysql數據庫服務器可以很容易地達到max_connections的限制。在這種情況下,mysql數據庫不會接受任何未來的連接請求。 這是您的傳呼機開始發出嗶嗶聲。

爲了避免達到max_connections的,使用持久連接需要以下變量小心平衡...

1. Number of apache processes on one host 
2. Total number of hosts running apache 
3. wait_timout variable in mysql db server 
4. max_connections variable in mysql db server 
5. Number of requests served by one apache process before it is re-spawned 

所以,PL使用足夠的審議後永久連接。您可能不想邀請複雜的運行時問題,以獲得持久連接的小增益。