2017-11-11 162 views
-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實例,或者當我完成時始終關閉會話並在需要時創建新會話是否正確?

+0

相關/可能重複[太多打開文件在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

+0

我認爲這可以幫助https://stackoverflow.com/questions/18650890/keeping-open-a-mongodb-database-connection。在我的情況下,我使用go和bigtable,並且保持連接活動(除非/直到服務器崩潰)。 – mayo

+0

非常感謝你,非常感謝:-) – j3d

回答

1

main package docs

新的會話通常是通過調用session.Copy上在撥號時獲得的 初始會話創建。這些新的會話將共享 相同的集羣信息和連接池,並且可能很容易將 交給組織邏輯的其他方法和函數。每創建一個會話都必須在其生命週期結束時調用它的Close方法,因此其資源可能會放回池中或收集起來,取決於具體情況。

含義:在啓動時,你應該Dial並保存會話,併爲每個調用NewUserDAO你應該CloneDial創建初始Session