質問やフィードバックがありましたら、フォームからお願いします
目次
本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください
現在人気のある sql
パッケージについて調査したところ、接続が失われた際に即座にエラーを通知する機能がほとんどないことに気付きました。例えば、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
を呼び出すと、実際には接続が確立されず、内部で接続プールが管理され、必要なときにのみ接続を試みることになります。つまり、クエリを実行中にネットワークの問題で接続が失われた場合、database/sql
は内部でリトライを試みてくれるのです。
これに関してはありがたいことですが、クエリを実行して初めて接続が失われていることを知るのではなく、その前にアプリケーション全体がこの状況を把握できることを望んでいます。
このようなことを実現したい場合、底層の Dialer ロジックを改修し、ネットワークが切断されたときに即座にプログラムに通知できるようにする必要があります。
この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨
☕Buy me a coffee