当我发现持久连接断开时,如何有效地重新连接到外部数据库?如果ExtClient
失去连接,它将在err
上返回“Broken pipe”。
func ListenForWork(cmdChannel <-chan *WorkCmd) {
for {
cmd, ok := <- cmdChannel
if !ok {
break
}
for { // Retry request until it's OK (`Broken pipe error` might destroy it)
_, err := ExtClient.Request(cmd.Key, cmd.Value)
if err == nil {
break
}
}
}
}
我可以通过这种方式或其他方法以有效的方式重新连接吗?此代码中的任何改进也是受欢迎的。 ExtClient
不会自行重新连接,而是一个全局变量。
答案 0 :(得分:3)
如果您使用mymysql,则可以使用auto reconnection interface。
来自文档
import (
"github.com/ziutek/mymysql/autorc"
_ "github.com/ziutek/mymysql/thrsafe" // You may also use the native engine
)
// [...]
db := autorc.New("tcp", "", "127.0.0.1:3306", user, pass, dbname)
// Initilisation commands. They will be executed after each connect.
db.Register("set names utf8")
// There is no need to explicity connect to the MySQL server
rows, res, err := db.Query("SELECT * FROM R")
checkError(err)
// Now we are connected.
// It does not matter if connection will be interrupted during sleep, eg
// due to server reboot or network down.
也就是说,通过阅读sql docs和sql driver docs以及相关代码,看起来如果SQL驱动程序返回ErrBadConn
,那么sql包将使用新连接重试。这只是在2012年7月添加的,所以SQL驱动程序可能尚未得到很好的支持。
答案 1 :(得分:0)
假设ExtClient具有连接或重新连接方法。
并且假设BrokenPipe错误导出为可以再次匹配的变量。
然后这应该有效if err == BrokenPipeErr { ExtClient.Connect(args ...SomeType) }
这些都是很多假设,所以你应该告诉我们一些更多的信息,比如你要连接的数据库。您正在使用哪个客户端库。和其他此类信息。