-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