2013-03-13 41 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