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 建立了新的连接。
我的疑问是:
收到回复我将非常感激。
谢谢!
问题是您在每个 UpdateCustomer 的调用中创建一个新的连接池,这很不方便且成本高昂。
\n\n您可以使用控制反转:
\n\n注意:我假设所有merchant\xe2\x80\x99s DB都托管在同一个mongo服务器节点或副本集中。
\n| 归档时间: |
|
| 查看次数: |
2722 次 |
| 最近记录: |