2013-03-13 78 views
2

当我发现持久连接已关闭时,如何有效地重新连接到外部数据库?如果ExtClient丢失连接,它将返回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不会自行重新连接,并且是全局变量。

回答

0

假设ExtClient具有Connect或Reconnect方法。

并且还假定BrokenPipe err作为可以重新匹配的变量导出。

这样,就可以if err == BrokenPipeErr { ExtClient.Connect(args ...SomeType) }

这些都是很多的假设,但这样你应该告诉我们多一点像你连接到哪个数据库的信息。你正在使用哪个客户端库。和其他这样的信息。

+0

是的,客户端库很蠢,我不想讨论那个特定的库。那么司机是否应该重新连接。也许就是这么简单。请求方法在我这样做之前知道错误,我想它也可以做一些事情。 – Gustav 2013-03-14 13:00:27

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驱动程序的很好支持。

+0

我在寻找一个独立于库的解决方案,但可能很简单,驱动程序应该处理重新连接。 – Gustav 2013-03-14 13:02:13

+0

我期望驱动程序处理重新连接。这就是它在Python中使用的其他语言中的工作原理。司机有更多的领域特定的知识,所以应该能够做得更好。 – 2013-03-14 18:06:18

相关问题