-1
这里是我的DAO实现的一个片段:MongoDB:我应该一直保持全局会话吗?
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
实例,或者当我完成时始终关闭会话并在需要时创建新会话是否正确?
相关/可能重复[太多打开文件在mgo去服务器](https://stackoverflow.com/questions/47179890/too-many-open-files-in-mgo-go-server/47180097#47180097 );和[gopkg.in/mgo.v2(Mongo,Go)中的并发]](https://stackoverflow.com/questions/42492020/concurrency-in-gopkg-in-mgo-v2-mongo-go/42495522#42495522) ;和[mgo - 查询性能似乎一贯很慢(500-650毫秒)](https://stackoverflow.com/questions/40999637/mgo-query-performance-seems-consistently-slow-500-650ms/41000876#41000876)。 – icza
我认为这可以帮助https://stackoverflow.com/questions/18650890/keeping-open-a-mongodb-database-connection。在我的情况下,我使用go和bigtable,并且保持连接活动(除非/直到服务器崩溃)。 – mayo
非常感谢你,非常感谢:-) – j3d