カランのブログ

ソフトウェアエンジニア / 台湾人 / 福岡生活

今のモード ライト

研究了一下现在比较热门的 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

作者

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

愷開 | Kalan

Kalan です。台湾出身で、2019年に日本へ転職し、福岡に住んでいます。フロントエンド開発に精通しているだけでなく、IoT、アプリ開発、バックエンド、電子工作などの分野にも挑戦しています。 最近、エレキギターを始めました。ブログを通じて、より多くの人と交流できればと思っています。気軽に絡んでください