重新连接外部数据库有什么好的模式?

时间:2013-03-13 20:38:18

标签: go

当我发现持久连接断开时,如何有效地重新连接到外部数据库?如果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不会自行重新连接,而是一个全局变量。

2 个答案:

答案 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 docssql driver docs以及相关代码,看起来如果SQL驱动程序返回ErrBadConn,那么sql包将使用新连接重试。这只是在2012年7月添加的,所以SQL驱动程序可能尚未得到很好的支持。

答案 1 :(得分:0)

假设ExtClient具有连接或重新连接方法。

并且假设BrokenPipe错误导出为可以再次匹配的变量。

然后这应该有效if err == BrokenPipeErr { ExtClient.Connect(args ...SomeType) }

这些都是很多假设,所以你应该告诉我们一些更多的信息,比如你要连接的数据库。您正在使用哪个客户端库。和其他此类信息。