感謝原文作者:https://blog.letsgo.tech/gorm-go-mysql-driver-invalid-connection/
最近出現了一個 bug,用戶經常會無法獲取到數據,並且只在深夜和早上出現。在自己進行測試時卻很難重現。
通過檢查服務端日志,發現了以下錯誤:
1 |
[mysql] 2018/02/04 06:43:21 packets.go:36: unexpected EOF |
上網搜索一番,檢查了 mysql 的各項配置找到了問題。
mysql 連接池中的連接被服務器單方面關閉了,而程序卻不知道,依然使用這個連接,所以會出現這個錯誤。
檢查mysql 設置的連接超時時間:
1 |
SHOW VARIABLES LIKE '%timeout%'; |
可以看到連接的超時關閉時間為 60 s。客戶端沒有限制超時關閉時間,這樣如果一個連接超過 60s 沒有使用,服務器會關閉這個連接,而客戶端並不知道連接已經被關閉,再通過這個連接去查詢數據時就失敗了。
高峰時期用戶很多,每個連接在達到 60s 之前就被復用了,然后連接的超時時間就會重置,所以用戶多的時候並不容易出現這個問題。
解決辦法就是為客戶端的連接池設置一個更短的生存時間。
1 |
db.DB().SetConnMaxLifetime(59 * time.Second) |