2009-10-09 53 views
2

我一直在想,爲什麼Apache爲每個頁面請求啓動一個到MySQL服務器的新連接?爲什麼它不是一直保持ONE連接打開,並通過該連接發送所有sql查詢(顯然,每個req都附帶了客戶端ID)?Apache - > MySQL多個連接vs一個連接

它減少了握手時間開銷,以及我看到的其他一些優點。

這就像每次你想使用它插入電腦。爲什麼每次插入插座時都要去插座?

回答

2

原因是:這很簡單。

重新使用連接,你必須發明和實現連接池。這增加了另一層需要開發,維護的代碼。

加上池連接邀請了其他一類錯誤,在開發應用程序時需要注意。例如,如果您定義了一個用戶變量,但該連接的下一個用戶關閉了根據該變量的存在進行分支的代碼路徑,那麼該用戶運行錯誤的代碼。其他問題包括:臨時表,事務死鎖,會話變量等,所有這些變得很難複製,因爲它取決於兩個不同用戶的後續操作,看起來彼此沒有聯繫。

此外,mysql連接的連接開銷很小。根據我的經驗,連接池確實增加了服務器可以支持的用戶數量。

1

因爲這就是mod_dbd模塊的用途。

2

MySQL不支持單個連接上的多個會話。例如,

Oracle允許此設置,並且您可以設置Apache以通過單個TCP連接來多重邏輯會話。

這是MySQL的限制,而不是Apache或腳本語言的限制。

有模塊,可以做會話池:

  • 預先創建的連接數
  • 選擇按需
  • 自由連接創建額外的連接,如果不是免費的連接可用。