..私のクエリアが平均500-650msである理由を示唆する明らかなものはありますか?
はいあります。 mgo.Dial()
を呼び出しています 各クエリを実行する前に。 mgo.Dial()
クエリの直後に閉じるMongoDBサーバーに毎回接続する必要があります。認証、リソースの割り当て(サーバー側とクライアント側の両方)など、接続が安定するまでに数百ミリ秒かかる可能性があります。これは非常に無駄です。
このメソッドは通常、特定のクラスターに対して1回だけ呼び出されます。 次に、取得したセッションでNewメソッドまたはCopyメソッドを使用して、同じクラスターへのセッションがさらに確立されます。これにより、基盤となるクラスターを共有し、接続プールを適切に管理できるようになります。
グローバルセッション変数を作成し、起動時に1回接続します (例:パッケージ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...
}