mongodb - 在 Golang 中正确使用 Mongo
问题描述
如何使用官方驱动程序在 Go 中创建一个适当的基于 mongo 的应用程序(go.mongodb.org/mongo-driver/mongo)
?我有一个MongoConnect()
和MongoDisconnect(client)
函数来创建一个连接并删除它。但是,它的效率不是很高,并且开始泄漏 FD,因为该应用程序有大约 40 个功能,并且查找所有错过的功能MongoDisconnect()
变得很忙。
目前MongoConnect
和MongoDisconnect
如下。
func MongoConnect() (*mongo.Client, error) {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
Logger(err)
return nil, err
}
err = client.Ping(context.TODO(), nil)
if err != nil {
Logger(err)
return nil, err
}
return client, err
}
func MongoDisconnect(client *mongo.Client) {
_ = client.Disconnect(context.TODO())
}
我正在寻找一种仍可用于MongoConnect()
创建连接并在不使用MongoDisconnect()
.
PS。也欢迎其他优于上述要求的方法
解决方案
我不确定是否有一种“有效”的方法来解决潜在问题,您可能需要查看您调用过的所有地方MongoConnect()
并确保您有相应的MongoDisconnect()
.
话虽如此,您可能希望看到的是实现连接到数据库的正确模式。
一般来说,如果您的数据库驱动程序为您管理连接,那么您应该创建一次连接并根据需要传递它。
您还可以将该连接的关闭推迟到一个 go 例程,该例程将在不再需要它时关闭它(当您的应用程序正在关闭时)。
这是如何实现的代码片段:
// =========================================================================
// Start Database
log.Println("main: Initializing database support")
db, err := database.Open(database.Config{
User: cfg.DB.User,
Password: cfg.DB.Password,
Host: cfg.DB.Host,
Name: cfg.DB.Name,
DisableTLS: cfg.DB.DisableTLS,
})
if err != nil {
return errors.Wrap(err, "connecting to db")
}
defer func() {
log.Printf("main: Database Stopping : %s", cfg.DB.Host)
db.Close()
}()
我没有编写这段代码,它是一个更大的项目脚手架的一部分,该脚手架有一些其他不错的 web 应用程序模式。
推荐阅读
- java - 如果有多种模式或没有模式,则从用户输入数组中查找模式
- swiftui - SwiftUI App 再次激活后重置 SKScene
- audio - sox splice 不遵守默认的excess=0.005 和leeway=0.005 并丢失太多音频?
- ruby-on-rails - docker化rails应用程序时Docker Build失败
- python - 在python中附加到制表表
- product - 如何批量更新产品?
- c++ - 嵌套动态数组模板
- mongodb - 当集合中已存在记录时,mongoDB 更新值以求和并记录
- html - 居中下拉按钮
- pandas - pandas:每个日期时间(索引)集群的最大列值,集群内距离 <= N 分钟