.. क्या कोई स्पष्ट बात है जो यह बताएगी कि मेरे प्रश्नों का औसत 500-650ms क्यों है?
हाँ वहाँ है। आप कॉल कर रहे हैं mgo.Dial()
प्रत्येक क्वेरी को निष्पादित करने से पहले। mgo.Dial()
हर बार MongoDB सर्वर से कनेक्ट करना होता है, जिसे आप क्वेरी के ठीक बाद बंद करते हैं। कनेक्शन को स्थापित होने में सैकड़ों मिलीसेकंड लग सकते हैं, जिसमें प्रमाणीकरण, संसाधनों का आवंटन (सर्वर और क्लाइंट दोनों तरफ) आदि शामिल हैं। यह बहुत बेकार है।
इस विधि को आमतौर पर किसी दिए गए क्लस्टर के लिए केवल एक बार कहा जाता है। प्राप्त सत्र पर नई या प्रतिलिपि विधियों का उपयोग करके उसी क्लस्टर में आगे के सत्र स्थापित किए जाते हैं। इससे वे अंतर्निहित क्लस्टर साझा करेंगे, और कनेक्शन के पूल को उचित रूप से प्रबंधित करेंगे।
एक वैश्विक सत्र चर बनाएं, स्टार्टअप पर कनेक्ट करें एक बार (उदाहरण के लिए एक पैकेज init()
. का उपयोग करके फ़ंक्शन), और उस सत्र का उपयोग करें (या इसकी एक प्रति / क्लोन, जो Session.Copy()
द्वारा प्राप्त किया गया है) या Session.Clone()
).उदाहरण के लिए:
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...
}