这是我的 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/