MongoDB:我应该一直保持全球会议吗?

时间:2017-11-11 17:53:56

标签: mongodb go

以下是我的DAO实施的片段:

type (
    User struct {
        Name string `json:"name" bson:"name"`
        ...
    }

    UserDAO struct {
        *mgo.Database
    }
)

func NewUserDAO() (*UserDAO, error) {
    session, err := mgo.Dial("mongodb://127.0.0.1:27017/test")
    if err != nil {
        return nil, err
    }

    return &UserDAO{session.DB("")}, nil
}

func (d *UserDAO) Insert(user User) error {
    return d.C("users").Insert(user)
}

func (d *CandleDAO) Find(name string) ([]User, error) {
    var result []User
    if err := d.C("users").Find(bson.M{"name": name)}).Sort("time").All(&result); err != nil {
        return nil, err
    }
    return result, nil
}

...

func (d *CandleDAO) Close() {
    d.Session.Close()
}

以下是我如何调用它:

dao, err := dao.NewUserDAO()
if err != nil {
    Log.Error(err.Error())
    return
}

// close session... is this OK?
defer dao.Close()

users, err := dao.Find(&broker.Symbol{"BTC", "USD"}); if err != nil {
    Log.Error(err.Error())
    return
}

for i, user := range users {
    fmt.Printf("%d ==> %v\n", i, user)
}

上面的代码工作......我的问题很简单:我是否应该保留一个全局mgo.Database实例,或者在我完成时始终关闭会话并在需要时创建一个新会话时是否正确?

1 个答案:

答案 0 :(得分:1)

根据main package docs

  

通常通过调用session.Copy来创建新会话   在拨号时获得的初始会话。这些新会议将分享   相同的集群信息和连接池,可能很容易   交给其他组织逻辑的方法和功能。一切   创建的会话必须在其结尾处调用其Close方法   一生,所以它的资源可能会被放回池中或收集,   视具体情况而定。

含义:在启动时,您应该Dial并保存该会话,并且对于NewUserDAO的每次通话,您应Clone使用Session创建的初始Dial