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