3

当我发现持久连接已关闭时,如何有效地重新连接到外部数据库?如果ExtClient失去连接,它将返回“Broken pipe” on err

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不会自行重新连接,并且是一个全局变量。

4

2 回答 2

3

如果您使用的是mymysql,那么您可以使用自动重新连接接口

从文档

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 文档sql 驱动程序文档以及相关代码来看,如果 SQL 驱动程序返回,ErrBadConn那么 sql 包将使用新连接重试。这只是在 2012 年 7 月添加的,因此 SQL 驱动程序可能还没有很好地支持它。

于 2013-03-14T07:40:20.230 回答
0

假设 ExtClient 有一个 Connect 或 Reconnect 方法。

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

那么这应该工作if err == BrokenPipeErr { ExtClient.Connect(args ...SomeType) }

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

于 2013-03-14T02:20:43.960 回答