簡體   English   中英

gopkg.in/mgo.v2中的並發(Mongo,Go)

[英]Concurrency in gopkg.in/mgo.v2 (Mongo, Go)

我希望在Go中編寫的webapp中使用MongoDB。

我可以擁有一個mgo.Session並在Web應用程序中同時使用它。 例如在http.Handler

或者我應該調用Session.CopySession.Close - > make session of sessions。

這聽起來很矛盾我讀到池已經在mgo.Session實現了,我可以同時使用會話,在其他地方我讀到我需要CopyClose

mgo.Session對於並發使用是安全的。 引用其文檔:

所有Session方法都是並發安全的,可以從多個goroutine中調用。

但這並不意味着您不應通過在撥號時獲得的初始會話上調用Session.Copy()Session.Clone()來並行創建和使用更多的並行。

並發安全並且從使用更多它們中受益並不相互排斥 (它們不是相互排斥的 )。 雖然你可以使用單個mgo.Session從夠程的任意數,不會很好地擴展,這不會在所有規模。 會話自動管理連接池,甚至可以管理多個服務器節點,但如果您使用單個Session ,則不會利用它。 通過在每個請求開始時創建一個新的Session (如果需要),並在最后正確地關閉它(使用Session.Close() ;最好使用defer調用),您可以利用可能在同時,可能到多個服務器節點(如果可用),從而更好地利用服務器資源; 並獲得更快的響應時間(從數據庫,最終到您的HTTP最終用戶)。 調用Session.Close()不關閉與服務器的底層連接,它只是將連接放回池中,准備被另一個會話拾取。

另請參閱有關Session s使用的相關問題: mgo - 查詢性能似乎一直很慢(500-650ms)

調用DialDialWithTimeoutDialWithInfo將建立連接池。 如果您需要多個會話,則需要調用session.Copy()或session.New(),session.Copy()是首選,因為它將保留auth。 這是一個例子:

假設您有一個UserService結構來處理所有用戶數據庫需求。 請注意,這是我的頭腦,所以可能會有一些語法錯誤,但這個想法就在那里。

type Userservice struct {
    DB *mgo.Session
}

func (s *Userservice) Create(u *User) error {
    sessionCopy := s.DB.Copy()
    defer sessionCopy.Close()

    db := sessionCopy.DB("test_db")
    col := db.C("users")

    if err := col.Insert(u); err != nil {
        return err
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM