我有一个网络流程,类似于
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
}
虽然mgopath.Connect看起来像
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()...
在某个地方:
EOF
问题是,几分钟后,对mongodb的所有查询都会返回错误ValidationRule
。我必须重新启动该过程才能让事情再次发挥作用。在Mac上经历过这两个问题,在Windows上经常遇到这些问题。 MongoDB在Docker内部运行,而Docker又在boot2docker内部运行。 VM端口转发已经完成(这就是查询在一定时间内工作的原因)。
每次我查询时,mgo是否要求我拨号?是否有一些我不知道的超时?
答案 0 :(得分:4)
答案可以在这里找到:https://groups.google.com/forum/#!topic/mgo-users/XM0rc6p-V-8
有两种简单的方法可以摆脱错误:
1)在会话上调用刷新,这会使其丢弃(或重新放入 池,如果连接良好)它所持有的连接,和 必要时挑选一个新的。
2)不使用单个会话,而是通过调用session.Copy来使用多个会话 当你需要一个新会话,然后调用session.Close时,你 完成它。这也意味着你正在使用多个连接 必要时,数据库。
答案 1 :(得分:1)
session.Copy可能会创建许多与mongodb的连接,在大项目中,你可能会“打开太多文件”,所以你可以试试这个:
如果您的连接不稳定,这将自动调用session.refresh。
减少连接,减少错误,用于重试策略。