gorm go-mysql-driver invalid connection


感謝原文作者:https://blog.letsgo.tech/gorm-go-mysql-driver-invalid-connection/

最近出現了一個 bug,用戶經常會無法獲取到數據,並且只在深夜和早上出現。在自己進行測試時卻很難重現。

通過檢查服務端日志,發現了以下錯誤:

1
2
[mysql] 2018/02/04 06:43:21 packets.go:36: unexpected EOF
[mysql] 2018/01/04 06:43:21 connection.go:311: invalid connection

上網搜索一番,檢查了 mysql 的各項配置找到了問題。

mysql 連接池中的連接被服務器單方面關閉了,而程序卻不知道,依然使用這個連接,所以會出現這個錯誤。

檢查mysql 設置的連接超時時間:

1
SHOW VARIABLES LIKE '%timeout%';

image-20190212182713040

可以看到連接的超時關閉時間為 60 s。客戶端沒有限制超時關閉時間,這樣如果一個連接超過 60s 沒有使用,服務器會關閉這個連接,而客戶端並不知道連接已經被關閉,再通過這個連接去查詢數據時就失敗了。

高峰時期用戶很多,每個連接在達到 60s 之前就被復用了,然后連接的超時時間就會重置,所以用戶多的時候並不容易出現這個問題。

解決辦法就是為客戶端的連接池設置一個更短的生存時間。

1
db.DB().SetConnMaxLifetime(59 * time.Second)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM