半熟前端

軟體工程師 / 台灣人 / 在前端的路上一邊探索其他領域的可能性

golang

在 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 斷線的時候,可以即時通知你的程式。