首页 > 解决方案 > 在 Golang 中正确使用 Mongo

问题描述

如何使用官方驱动程序在 Go 中创建一个适当的基于 mongo 的应用程序(go.mongodb.org/mongo-driver/mongo)?我有一个MongoConnect()MongoDisconnect(client)函数来创建一个连接并删除它。但是,它的效率不是很高,并且开始泄漏 FD,因为该应用程序有大约 40 个功能,并且查找所有错过的功能MongoDisconnect()变得很忙。

目前MongoConnectMongoDisconnect如下。

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。也欢迎其他优于上述要求的方法

标签: mongodbgo

解决方案


我不确定是否有一种“有效”的方法来解决潜在问题,您可能需要查看您调用过的所有地方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 应用程序模式。

极致服务


推荐阅读