2013-03-13 6 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.

А также предполагая, что errno BrokenPipe экспортируется как переменная, которую вы можете сопоставить снова.

Тогда это должно работать if err == BrokenPipeErr { ExtClient.Connect(args ...SomeType) }

Это много предположений, хотя, так что вы, вероятно, следует сказать нам немного больше информации, как то, что базы данных вы подключаетесь. Какую клиентскую библиотеку вы используете. И другая такая информация.

+0

Да, клиентская библиотека довольно глупа, я не хочу обсуждать эту конкретную библиотеку. Если водитель снова подключится. Может быть, все так просто. Метод-запрос знает об ошибке, прежде чем я это сделаю, я думаю, что он мог бы что-то с этим поделать. – Gustav

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 года, поэтому, возможно, пока не поддерживается драйверами SQL.

+0

Я ищу библиотечное независимое решение, но, возможно, это довольно просто, драйвер должен обрабатывать пересоединения. – Gustav

+0

Я бы ожидал, что водитель справится с повторными подключениями. Вот как это работает на других языках, которые я использовал как python. Водитель имеет больше знаний о домене, поэтому должен быть в состоянии сделать это лучше. –

Смежные вопросы