MongoDB:我应该一直保持全局 session 吗?

标签 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 实例还是在我完成后始终关闭 session 并创建一个新实例是否正确每当我需要的时候?

最佳答案

根据 main package docs :

New sessions are typically created by calling session.Copy on the initial session obtained at dial time. These new sessions will share the same cluster information and connection pool, and may be easily handed into other methods and functions for organizing logic. Every session created must have its Close method called at the end of its life time, so its resources may be put back in the pool or collected, depending on the case.

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

关于MongoDB:我应该一直保持全局 session 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241042/

相关文章:

node.js - 如何更改 MongoDB 和 mongoose 中的日期格式

pointers - 戈朗 : Passing in Slice as Reference issue

unicode - 使用 Go 删除​​变音符号

node.js - Mongoose.js findOne 返回查询元数据

c# - BSON 文档到 FilterDefinition<Bson> MongoDb c# 驱动程序

unit-testing - Golang 单元测试用户输入

go - 如何修复'(1 << 100)* 0.1和(1 << 100)/10'

mongodb - 如何访问 mongodb 中存在的数组值?

java - 修剪从 mongoDB 收到的 json 中的双引号

mongodb - 在 mongodb 投影中组合 $elemMatch 和 $