..有什么明显的证据可以表明为什么我的查询器平均需要500-650ms?
就在这里。您
mgo.Dial()在执行每个查询之前先进行调用。
mgo.Dial()必须每次都连接到MongoDB服务器,在查询后立即关闭它。建立连接很可能需要数百毫秒,包括身份验证,分配资源(在服务器和客户端),等等。这非常浪费。
对于给定的群集,通常只调用一次此方法。
然后,在获取的会话上使用“新建”或“复制”方法建立到同一群集的其他会话。这将使它们共享基础群集,并适当地管理连接池。
创建一个全局会话变量,在启动时连接 一次
(使用例如包
init()函数),然后使用该会话(或由
Session.Copy()或获得的该会话的副本/克隆
Session.Clone())。例如:
var session *mgo.Sessionvar info *db.Inf // Use your type herefunc 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...}


