【发布时间】: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 实例还是在我完成时始终关闭会话并在需要时创建一个新实例是否正确?
【问题讨论】:
-
我认为这可以帮助stackoverflow.com/questions/18650890/…。就我而言,我使用的是 go 和 bigtable,并且我保持连接处于活动状态(除非/直到服务器崩溃)。
-
好的,非常感谢,非常感谢:-)