..有什么明显的证据可以表明为什么我的查询器平均需要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...
}