2008-08-26 53 views
1

關於單身人士的討論PHP讓我更多地思考這個問題。大多數人指示你不應該在一個請求中創建一堆數據庫連接,我只是對你的推理是好奇的。我的第一個想法是向DB提出這麼多請求的腳本的開銷,但是我反駁了自己的問題:多個連接不會使併發查詢更有效嗎?爲什麼在一個請求中建立多個數據庫連接是不好的做法?

某些知情人士的答案(有證據,人們)如何?

回答

6

數據庫連接是有限的資源。一些數據庫的連接限制非常低,並且浪費連接是一個主要問題。通過消耗很多連接,您可能會阻止其他人使用數據庫。

此外,除非數據庫服務器上的資源閒置,否則在數據庫中引發大量額外連接無助於任何事情。如果您擁有8個內核,並且只有一個用於滿足查詢,那麼確定另一個連接可能會有所幫助。但是,更有可能的是,您已經在使用所有可用的內核。您也可能爲每個數據庫請求創建相同的硬盤驅動器,並添加額外的鎖爭用。

如果您的數據庫具有類似高利用率的任何內容,則添加額外的連接將無濟於事。這就像在應用程序中產生額外的線程,盲目地希望額外的併發將使處理更快。在某些情況下,它可能會可能,但在其他情況下,它只會減慢硬盤驅動器的速度,浪費時間進行任務切換並引入同步開銷。

3

這是建立連接,傳輸數據然後拆除的成本。它會吃掉你的表現。

證據是很難得的,但考慮以下...

比方說,它帶有x微秒進行連接。

現在,您想要發出多個請求並來回獲取數據。假設運輸時間的差異在一個連接與多個連接之間是可以忽略的(僅僅是爲了論證)。

現在我們假設需要y微秒來關閉連接。

打開一個連接將花費x + y微妙的開銷。打開許多將需要n *(x + y)。這會延遲執行。

0

我認爲這是因爲您的請求沒有被異步發送,因爲您的請求是在服務器上迭代地完成的,每次都會阻止,每次只需要支付每次創建連接的開銷必須這樣做一次......

在Flex中,所有Web服務調用都是自動異步調用的,所以您在同一個連接上看到多個連接或排隊請求是很常見的。

異步請求,通過更快的請求/響應時間,減輕連接成本......因爲你可以很容易不達到這個在PHP沒有一些線程,則性能命中大於簡單地重複使用相同的連接。

這是我的2美分...

2

建立一個數據庫連接通常是相當重的。很多事情都在後臺進行(DNS解析/ TCP連接/握手/身份驗證/實際查詢)

我有一個問題曾經有一些奇怪的DNS配置,使每個TCP連接花費了幾秒鐘,然後再上去。我的登錄過程(由於複雜的體系結構)需要3個不同的數據庫連接才能完成。有了這個問題,它將永久登錄。然後,我們重構代碼以使其僅通過一個連接。

1

我們從.NET訪問Informix並使用多個連接。除非我們在每個連接上啓動事務,否則它通常在連接池中處理。我知道這是特定品牌,但大多數(?)數據庫系統的無聲訪問將盡可能地集中連接。

另外,由於跨數據庫連接,我們確實存在連接數問題。Informix支持同義詞,所以我們將常見的犯罪人同義,並且多個連接在服務器端處理,節省了很多傳輸時間,連接創建開銷以及(我們現狀的真正關鍵)許可證費用。

相關問題