在 Go 如何處理 connection lost?
# 開發筆記研究了一下現在比較熱門的 sql 套件,發現幾乎都沒有像是可以即時在 connection lost 的時候跳 error 的功能。例如:nodejs 的 mysql 當中,我們可以用 connection.on(‘error’) 來監聽錯誤。
不過在 golang (至少在幾個比較熱門的套件)當中,卻沒有類似的功能。再深入一下也不難理解。
The sql package creates and frees connections automatically; it also maintains a free pool of idle connections. If the database has a concept of per-connection state, such state can be reliably observed within a transaction (Tx) or connection (Conn). Once DB.Begin is called, the returned Tx is bound to a single connection. Once Commit or Rollback is called on the transaction, that transaction’s connection is returned to DB’s idle connection pool. The pool size can be controlled with SetMaxIdleConns.
簡單來講,當你呼叫 sql.Open 的時候,並不會真正建立 connection,而是在內部維護 connection pool,有需要的時候才嘗試連接。也就是說,如果你在進行一個 Query 時,由於網路問題造成 connection lost,database/sql 在底層會試著幫你 retry。
說起來這也算是好事啦,這樣就不用自己再去處理重試的邏輯。但有時候你並不想在下 query 才知道原來 connection lost 了,我希望在這之前整個應用程式就知道這件事情。
如果你想要達成類似的事情,你需要改寫底層的 Dialer 邏輯,讓 network 斷線的時候,可以即時通知你的程式。
相關文章
- 別再用 AWS Access Key 了Access Key 是 AWS 上容易被忽略的安全風險。用 OIDC 搭配 IAM Role,讓 GitHub Actions 不需要任何 secret 就能安全操作 AWS 資源
- 資料庫主鍵:AUTO_INCREMENT、UUID 與 UUIDv7後端開發常需要決定主鍵,要用 auto increment 還是 UUID?碰撞怎麼辦?UUIDv7 跟 created_at + index 的效能差多少?實際跑了 2000 萬筆資料與設計決策告訴你
- Zeabur 使用心得分享一般獨立開發者要部署服務時都會選擇 Vercel 之類的平台,但有時候需要更進階的需求如資料庫連接時,Vercel 就沒那麼方便,而一般雲端服務商的價格對獨立開發來說也很貴,這篇文章分享了一些使用 Zeabur 的心得,推薦給大家!
- 鍵盤入坑指南 - 韌體篇本篇為 IT 2023 鐵人賽文章:鍵盤入坑指南 - 韌體篇