2017-03-31 107 views
1

我切換到使用PDO持久連接。我遇到了以下情況:MySQL(正確)在其端點關閉連接(由於處於非活動狀態),並且PDO沒有啓動它,將連接保留在其緩存中,並且從此開始 - 任何嘗試使用此連接的結果失敗了。PDO是否關閉永久連接?

從我讀過的這種行爲是「通過設計」(對我來說,看起來PDO正在走出不支持持續連接的方式)。

無論哪種方式,我想知道PDO是否會在之前關閉其連接池。我知道它不檢查連接的狀態,但是有沒有任何種類的定時器或定期清理,可配置或硬編碼?

+0

如果您希望保持與數據庫的工作連接,您必須不時在PHP中手動ping連接。 MySQL關閉非活動連接的時間可以在MySQL配置中更改 –

+0

有關某些錯誤消息,您會得到什麼? –

+0

@YourCommonSense嘗試使用已關閉的連接時出現的錯誤類似於「MySQL服務器已經消失」。 – obe

回答

1

人們不應該擔心連接的持久性。

如果您正在構建一個網頁 - 它應該在連接超時之前完成。

如果您有一個長時間運行的應用程序沒有觸及數據庫的時間跨度很長,那麼請考慮重新安排代碼或關閉並重新打開或發現它已關閉並重新打開。

請注意,連接可能會因爲任何原因而關閉 - 許多原因與網絡中的打嗝有關。因此,應用程序應該準備好從關閉的連接中恢復,無論它聲稱如何「持久」。

「連接池」在許多層次上處理 - 在客戶端庫中,在「代理服務器」中,即使在MySQL服務器中。他們的行爲不同。

連接池並不是那麼有用。事實上,我追逐的每個性能問題都與不是有關[重新]建立連接所需的時間。

其他RDBMS供應商的連接時間極其緩慢,導致業界發明連接池和持久連接。但MySQL對這種需求不大。

有幾個超時可觸發關閉連接;您受DBA/SE/Cloud提供程序的限制,即它們設置了哪些值。

PDO只是衆多圖層中的一個,所以您的問題太窄了。我希望我提供了更廣泛的答案。

+1

我很欣賞這種努力和細節,但實際上並沒有回答我的問題(這是狹義的,是關於特定的PDO行爲(或缺乏))。一些注意事項:啓用SSL後,MySQL連接需要更長的時間。儘管我同意每個(或幾乎每個)性能問題都可以通過修改設計或編碼實踐來解決,但我認爲在有效的業務情況下,切換到PDO持久連接可以提供所需的邊緣,並且優於修改體系結構。 – obe

+0

關於正常處理錯誤:處理隨機事件(可能只是向用戶返回一些錯誤消息,甚至由於各種原因重新連接更可取),以及不可避免地經常出現這些錯誤(只是因爲底層庫不會定期重置連接)。 – obe