在Go应用程序中使用MongoDb连接池

问题描述 投票:0回答:1

我正在与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
}

连接到db的模型函数的示例:

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
}

我怎么称呼这个功能:

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

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

我的查询是:

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

我非常感谢收到答复。

谢谢!

mongodb go connection connection-pooling
1个回答
0
投票

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

您可能会考虑使用控制反转:

  • 为应用程序设置中的每个商家数据库准备一个连接池。
  • 在模型的结构(例如MerchantDatabase)中插入mgo会话的准备好的映射]
  • 在模型的函数调用中使用相应的会话
© www.soinside.com 2019 - 2024. All rights reserved.