【问题标题】:MongoDB: Shall I keep a global session all the time?MongoDB:我要一直保持一个全局会话吗?
【发布时间】:2017-11-11 17:53:56
【问题描述】:

这是我的 DAO 实现的 sn-p:

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 实例还是在我完成时始终关闭会话并在需要时创建一个新实例是否正确?

【问题讨论】:

标签: mongodb go


【解决方案1】:

根据main package docs

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 2022-06-11
    • 1970-01-01
    • 2021-05-18
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多