将 MongoDb 连接池与 Go 应用程序一起使用

Ama*_*aur 1 connection connection-pooling go mongodb

我正在与 Mongodb 一起开发 Golang SAAS 应用程序。以前我在没有池的情况下使用数据库连接。因此,当一些流量进入​​时,我的数据库会挂起或关闭。

然后我开始了解连接池。我对此进行了探索,但我有些怀疑它是否适合我的应用程序结构。

我在这里提供了我的应用程序中的一些代码示例。

创建与数据库的连接的函数:

func ConnectDb(merchantDb string) (mongoSession *mgo.Session) {
    mongoDBDialInfo := &mgo.DialInfo{
        Addrs:     []string{DatabaseIpPort},
        Username:  DbUsername,
        Password:  DbPassword,
        Source:    DbSource,
        Database:  merchantDb,
        Timeout:   60 * time.Second,
        PoolLimit: 4096,
    }
    mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo)
    if err != nil {
        fmt.Printf("CreateSession: %s\n", err)
        defer mongoSession.Close()
        return mongoSession
    }
    mongoSession.SetMode(mgo.Monotonic, true)
    return mongoSession
}
Run Code Online (Sandbox Code Playgroud)

连接到数据库的模型函数示例:

func (MerchantDb *MerchantDatabase) UpdateCustomer(uid int, query interface{}) (err error) {
    mongoSession := config.ConnectDb(MerchantDb.Database)
    defer mongoSession.Close()

    sessionCopy := mongoSession.Copy()
    defer sessionCopy.Close()

    getCollection := sessionCopy.DB(MerchantDb.Database).C("customers")
    err = getCollection.Update(bson.M{"uid": uid}, query)
    return err
}
Run Code Online (Sandbox Code Playgroud)

我如何调用这个函数:

type MerchantDatabase struct {
    Database string
}
merchantDb := MerchantDatabase{c.Keys["merchant_db"].(string)}
merchantDb.UpdateUser(7, bson.M{"$set": bson.M{"name": "john"})
Run Code Online (Sandbox Code Playgroud)

像上面的代码一样,我对每个查询使用不同的模型函数,并且在每个模型函数中都与 mongodb 建立了新的连接。

我的疑问是:

  1. 我刚刚使用现有代码通过了 PoolLimit。这是连接池的工作方式吗?还是还有别的什么?
  2. 另外,在我的应用程序中,根据商家有多个数据库。这就是为什么我用数据库签名调用每个模型函数,以便它可以查询该特定数据库。我很困惑,因为连接池作为连接缓存,它是否可以将一个商家的数据库连接用于其他商家的数据库?如果是,如何通过连接池来防止这种情况?
  3. 如何确定应用程序连接池的限制?

收到回复我将非常感激。

谢谢!

red*_* la 5

问题是您在每个 UpdateCustomer 的调用中创建一个新的连接池,这很不方便且成本高昂。

\n\n

您可以使用控制反转:

\n\n
    \n
  • 在应用程序设置中准备连接池。
  • \n
  • 将准备好的 mgo 会话注入 model\xe2\x80\x99s 结构中(例如 MerchantDatabase)
  • \n
  • 在模型的函数调用中使用注入的会话连接到相应的merchant\xe2\x80\x99s DB。
  • \n
\n\n

注意:我假设所有merchant\xe2\x80\x99s DB都托管在同一个mongo服务器节点或副本集中。

\n