カランのブログ

Kalan 頭像照片,在淡水拍攝,淺藍背景

四零二曜日電子報上線啦!訂閱訂起來

ソフトウェアエンジニア / 台湾人 / 福岡生活
このブログはRSS Feed をサポートしています。RSSリンクをクリックして設定してください。技術に関する記事はコードがあるのでブログで閲覧することをお勧めします。

今のモード ライト

我會把一些不成文的筆記或是最近的生活雜感放在短筆記,如果有興趣的話可以來看看唷!

記事のタイトルや概要は自動翻訳であるため(中身は翻訳されてない場合が多い)、変な言葉が出たり、意味伝わらない場合がございます。空いてる時間で翻訳します。

Goで接続が失われた場合の対処方法は?

研究了一下现在比较热门的 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 断线的时候,可以即时通知你的程序。

次の記事

[golangノート] プロジェクトの環境変数を設定する方法

前の記事

CORS でのクッキーの取り扱い

この文章が役に立つと思うなら、下のリンクで応援してくれると大変嬉しいです✨

Buy me a coffee