Go Lang和Labix mgo - 在后续请求之后获得EOF

时间:2015-05-06 20:04:31

标签: mongodb go mgo

我有一个网络流程,类似于

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是否要求我拨号?是否有一些我不知道的超时?

2 个答案:

答案 0 :(得分:4)

答案可以在这里找到:https://groups.google.com/forum/#!topic/mgo-users/XM0rc6p-V-8

  

有两种简单的方法可以摆脱错误:

     

1)在会话上调用刷新,这会使其丢弃(或重新放入   池,如果连接良好)它所持有的连接,和   必要时挑选一个新的。

     

2)不使用单个会话,而是通过调用session.Copy来使用多个会话   当你需要一个新会话,然后调用session.Close时,你   完成它。这也意味着你正在使用多个连接   必要时,数据库。

答案 1 :(得分:1)

session.Copy可能会创建许多与mongodb的连接,在大项目中,你可能会“打开太多文件”,所以你可以试试这个:

reflected XSS attack

如果您的连接不稳定,这将自动调用session.refresh。

减少连接,减少错误,用于重试策略。