2008-10-12 110 views
2

有時在我們的生產環境發生服務器連接(這是使用MySQLdb的python程序)和mysql服務器連接不暢時,一些軟件包丟失,一些黑魔法發生,MySQLdb.execute()對象永遠不會結束(或花費大量時間結束)。MySQLdb執行超時

這是非常糟糕的,因爲這是浪費服務工作者線程。有時會導致工作人員疲憊不堪,服務停止響應。

所以問題是:有沒有辦法在給定的時間後中斷MySQLdb.Connection.execute操作?

回答

2

如果通信存在這樣的問題,可以考慮編寫一個'代理',通過脆弱的連接接收你的SQL命令,並將它們轉發到MySQL服務器的可靠通道上(可能與MySQL服務器在同一個機器上運行) 。這樣您就可以完全控制故障檢測和重試。

1

您需要準確分析問題所在。如果服務器不在,MySQL連接最終應該超時; TCP保持活動通常啓用。您可能能夠調整OS級TCP超時。

如果數據庫是「片狀」,那麼您肯定需要調查如何。數據庫似乎不太可能是問題,更可能是兩者之間的網絡。

如果您正在使用任何類型的(某些)狀態防火牆,則可能是因爲它們正在丟失某些狀態,從而導致長時間連接失敗。

您可能需要考慮更改MySQL中的空閒超時參數;否則,長期未使用的連接可能會「過時」,服務器和客戶端都認爲它仍然存在,但其間的一些有狀態網絡元素已經「忘記」了TCP連接。嘗試使用這種「陳舊」連接的應用程序在收到錯誤之前會有很長的等待時間(但最終會發生)。