【问题标题】:Go Lang and Labix mgo - getting EOF after subsequent requestsGo Lang 和 Labix mgo - 在后续请求后获取 EOF
【发布时间】:2015-05-06 20:04:31
【问题描述】:

我有一个 web 进程,类似于

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 是否要求我每次进行查询时都拨打电话?是否有一些我不知道的超时?

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

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

    有两种简单的方法可以消除错误:

    1) 在会话上调用 Refresh,使其丢弃(或放回 池,如果连接良好)它所持有的连接,以及 必要时选择一个新的。

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

    【讨论】:

    • 即使这样也行不通。看到这个:github.com/go-mgo/mgo/issues/473
    • @InancGumus 我看不出你的问题和这个问题之间的联系。
    • @mikezter 获得 EOF 的后续请求
    【解决方案2】:

    session.Copy 可能会创建很多很多到 mongodb 的连接,在大型项目中,您可能会出现“打开的文件过多”,所以您可以试试这个:

    https://github.com/ti/mdb

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

    连接少,错误少,重试策略。

    【讨论】:

    • 欢迎来到 SO。请阅读此how-to-answer 以提供高质量的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多