.. apakah ada sesuatu yang jelas yang menunjukkan mengapa kueri saya rata-rata 500-650 md?
Ya ada. Anda memanggil mgo.Dial()
sebelum mengeksekusi setiap kueri. mgo.Dial()
harus terhubung ke server MongoDB setiap saat, yang Anda tutup tepat setelah kueri. Koneksi mungkin membutuhkan ratusan milidetik untuk stabil, termasuk otentikasi, mengalokasikan sumber daya (baik di sisi server dan klien), dll. Ini sangat boros.
Metode ini umumnya dipanggil hanya sekali untuk cluster tertentu. Sesi lebih lanjut ke cluster yang sama kemudian dibuat menggunakan metode Baru atau Salin pada sesi yang diperoleh. Ini akan membuat mereka berbagi cluster yang mendasarinya, dan mengelola kumpulan koneksi dengan tepat.
Buat variabel sesi global, sambungkan saat startup sekali (menggunakan mis. paket init()
function), dan gunakan sesi itu (atau salinan / tiruannya, diperoleh dengan Session.Copy()
atau Session.Clone()
).Misalnya:
var session *mgo.Session
var info *db.Inf // Use your type here
func init() {
var err error
if info, err = db.Info(); err != nil {
log.Fatal(err)
}
if session, err = mgo.Dial(info.ConnectionString()); err != nil {
log.Fatal(err)
}
}
func (r userRepo) GetUserByID(id string) (User, error) {
sess := session.Clone()
defer sess.Close()
// Now we use sess to execute the query:
var user User
c := sess.DB(info.Db()).C("users")
// Rest of the method is unchanged...
}