为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
浮云间 2022-06-13 10:29:42
我目前从MongoDBon开始GoLang。我目前的用例是这样的。我希望MongoDB Database在特定包中初始化与 my 的连接,并client在其他几个本地包中使用返回的连接。这是我尝试过的,我已经将连接初始化到MongoDB一个名为dataLayer如下的包内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() {    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?
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您不必InitDataLayer一遍又一遍地打电话。您只需要创建一个客户端,就可以使用同一个客户端从不同的地方连接到 Mongo DB。


Mongo 客户端在内部维护一个连接池,因此您不必一次又一次地创建此客户端。


将此客户端存储为结构字段并继续重复使用它是一个很好的设计。


编辑:


创建连接


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()(*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

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信