如何在 Golang 中跨包管理 MongoDB 客户端

我目前从MongoDBon开始GoLang。我目前的用例是这样的。


我希望MongoDB Database在特定包中初始化与 my 的连接,并client在其他几个本地包中使用返回的连接。这是我尝试过的,


我已经将连接初始化到MongoDB一个名为dataLayer如下的包内


package dataLayer


import (

    "context"

    "log"

    "time"


    "go.mongodb.org/mongo-driver/mongo"

    "go.mongodb.org/mongo-driver/mongo/options"

    "go.mongodb.org/mongo-driver/mongo/readpref"

)


func InitDataLayer() {

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    defer cancel()

    client, err := mongo.Connect(ctx, options.Client().ApplyURI(credentials.MONGO_DB_ATLAS_URI))

    if err != nil {

        log.Fatal(err)

    } else {

        log.Println("Connected to Database")

    }

}

现在,如果我希望client在其他包中使用返回的内容,继续initDataLayer一遍又一遍地调用以取回 a是否生产安全client?


浮云间
浏览 96回答 1
1回答

慕哥6287543

您不必InitDataLayer一遍又一遍地打电话。您只需要创建一个客户端,就可以使用同一个客户端从不同的地方连接到 Mongo DB。Mongo 客户端在内部维护一个连接池,因此您不必一次又一次地创建此客户端。将此客户端存储为结构字段并继续重复使用它是一个很好的设计。编辑:创建连接package dataLayerimport (    "context"    "log"    "time"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options"    "go.mongodb.org/mongo-driver/mongo/readpref")func InitDataLayer()(*mongo.Client) {    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)    defer cancel()    client, err := mongo.Connect(ctx, options.Client().ApplyURI(credentials.MONGO_DB_ATLAS_URI))    if err != nil {        log.Fatal(err)    } else {        log.Println("Connected to Database")    }    return client}main.go,在使用结束时关闭连接,否则会泄漏连接。func main(){   //...   client = dataLayer.InitDataLayer()   defer client.Disconnect(context.Background())   ...}Repository/DAL,将客户端存储在 Repository 结构中界面type BookRepository interface {   FindById( ctx context.Context, id int) (*Book, error)}将客户端存储在结构中的存储库实现type bookRepository struct {  client *mongo.Client}func (r *bookRepository) FindById( ctx context.Context, id int) (*Book, error) {  var book  Book  err := r.client.DefaultDatabase().Collection("books").FindOne(ctx, bson.M{"_id": id }).Decode(&book)    if err == mongo.ErrNoDocuments {    return nil, nil  }  if err != nil  {     return nil, err  }  return &book, nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go