dongmen1925 2015-05-06 20:04
浏览 62

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

I have a web process, similar to

func main() {
    // mgo
    mongoDatabase, err := mgopath.Connect(envMongoPath)
    if err != nil {

    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))

while mgopath.Connect looks like

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

Somewhere down the road:

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()...

The problem is, that after a couple of minutes, all queries to mongodb return the error EOF. I have to restart the process to get things working again. Experienced both issues on Mac and (more frequently) on Windows. MongoDB runs inside of Docker, which in turn runs inside of boot2docker. VM Port forwarding have been done (that's why queries work for a certain amount of time).

Does mgo require me to dial every time I'm doing a query? Is there some timeout I don't know about?

  • 写回答

2条回答 默认 最新

  • 普通网友 2015-05-14 11:09

    The answer can be found here:!topic/mgo-users/XM0rc6p-V-8

    There are two easy ways to get rid of the error:

    1) Call Refresh on the session, which makes it discard (or put back in the pool, if the connection is good) the connection it's holding, and pick a new one when necessary.

    2) Instead of using a single session, use many by calling session.Copy when you need a new session, and then call session.Close when you're done with it. This will also mean you're using multiple connections to the database, when necessary.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?



  • ¥15 streamingtool
  • ¥15 MATLAB图像问题
  • ¥20 树莓派5做人脸情感识别与反馈系统
  • ¥15 selenium 控制 chrome-for-testing 在 Linux 环境下报错 SessionNotCreatedException
  • ¥15 使用pyodbc操作SQL数据库
  • ¥15 MATLAB实现下列
  • ¥30 mininet可视化打不开.mn文件
  • ¥50 C# 全屏打开Edge浏览器
  • ¥80 WEBPACK性能优化
  • ¥30 python拟合回归分析