以下是我的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
实例,或者在我完成时始终关闭会话并在需要时创建一个新会话时是否正确?
答案 0 :(得分:1)
通常通过调用session.Copy来创建新会话 在拨号时获得的初始会话。这些新会议将分享 相同的集群信息和连接池,可能很容易 交给其他组织逻辑的方法和功能。一切 创建的会话必须在其结尾处调用其Close方法 一生,所以它的资源可能会被放回池中或收集, 视具体情况而定。
含义:在启动时,您应该Dial
并保存该会话,并且对于NewUserDAO
的每次通话,您应Clone
使用Session
创建的初始Dial