2017-02-09 176 views
0

我正在Go中寫一個小型的網絡應用程序,它使用mysql來存儲數據。什麼是mysql連接超時的最佳解決方案?

我有間歇性MySQL錯誤如果Web服務器沒有得到(> 8小時)的一定時間後的任何請求:

[mysql] 2017/02/08 16:31:56 packets.go:33: unexpected EOF 
[mysql] 2017/02/08 16:31:56 packets.go:130: write tcp 127.0.0.1:49188->127.0.0.1:3306: write: broken pipe 

我發現GitHub上(issue 529issue 257issue 446一些相關的討論)。據我所知,如果達到超時,mysql db會關閉連接。

我試圖將SetMaxOpenConns設置爲9,SetMaxIdleConns設置爲0,因爲有些人推薦。但是,這立即引發異常。 (但如果我設置SetMaxIdleConns大於0,則沒有立即拋出異常)

我也嘗試將SetConnMaxLifetime設置爲5分鐘。這在5分鐘後也拋出異常。

現在,我想下面的代碼:

db.SetConnMaxLifetime(0) 
db.SetMaxOpenConns(10) 
db.SetMaxIdleConns(5) 

它已經運行了20分鐘。現在說還爲時過早。 (UPDATE:這也不行)

下面是配置:

  • 司機:去-SQL驅動程序V1.3。
  • 去版本:go1.7.1達爾文/ AMD64
  • 的mysql:latest from docker hub
  • RKT版本:1.18
  • CoreOS:1284.0.0

回答

1

也許你可以開始心跳夠程,以避免超時。

+0

對於{db.ping()}'來說,作爲心跳門控就足夠了嗎? – city

+0

或者{{for {db.Exec(「DO 42」)}}'最好在https://github.com/go-sql-driver/mysql/issues/498 – city

+1

處給出建議。在一段時間內.Ticker不需要儘可能快地進行ping操作。 – Adrian

相關問題