У меня есть веб-процесс, похожий на
func main() {
// mgo
mongoDatabase, err := mgopath.Connect(envMongoPath)
if err != nil {
log.Fatal(err)
}
r := mux.NewRouter()
// ....
r.HandleFunc("/apps/{app:.+}", stuffHandler(mongoDatabase)).Methods("GET")
http.Handle("/", r)
listen := fmt.Sprintf("%s:%s", host, port)
log.Fatal(http.ListenAndServe(listen, nil))
}
в то время как mgopath.Connect выглядит
func Connect(mongoPath string) (*mgo.Database, error) {
dbConfig, err := url.Parse(mongoPath)
if err != nil {
return nil, err
}
log.Printf("Connecting to %s", dbConfig.Host)
sess, err := mgo.Dial(dbConfig.Host)
if err != nil {
return nil, err
}
dbName := dbConfig.Path
log.Printf("Using database %s", dbName)
if len(dbName) < 2 {
return nil, errors.New("No database name specified.")
}
dbName = dbConfig.Path[1:len(dbConfig.Path)]
return sess.DB(dbName), err
}
Где-то по дороге:
c := database.C("stuff")
err = c.Find(bson.M{"id": id}).One(&item) // First ~1-2 minutes work as expected, then I receive EOFs
// c.Insert(), c.Update(), c.All()...
Проблема в том, что через пару минут все запросы к mongodb возвращают ошибку EOF
. Я должен перезапустить процесс, чтобы все снова заработало. Были проблемы как на Mac, так и (чаще) на Windows. MongoDB работает внутри Docker, который, в свою очередь, работает внутри boot2docker. Произведена переадресация портов ВМ (поэтому запросы работают определенное время).
Требует ли mgo набирать номер каждый раз, когда я делаю запрос? Есть ли какой-то тайм-аут, о котором я не знаю?