我正在与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建立了新的连接。
我的查询是:
我非常感谢收到答复。
谢谢!
问题是您在每个UpdateCustomer的调用中都创建了一个新的连接池,这不方便且成本很高。
您可能会考虑使用控制反转: