首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Golang跨包管理MongoDB客户端

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

Stack Overflow用户
提问于 2020-06-14 20:31:34
回答 1查看 3.1K关注 0票数 4

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

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

我在一个名为MongoDB的包中初始化了与dataLayer的连接,如下所示

代码语言:javascript
复制
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以获得一个client是否安全?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-14 20:39:02

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

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

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

编辑:

创建连接

代码语言:javascript
复制
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,

在使用结束时关闭连接,否则连接会泄漏。

代码语言:javascript
复制
func main(){
   //...
   client = dataLayer.InitDataLayer()
   defer client.Disconnect(context.Background())
   ...
}

存储库/DAL,在存储库结构中存储客户端

接口

代码语言:javascript
复制
type BookRepository interface {
   FindById( ctx context.Context, id int) (*Book, error)
}

在struct中存储客户端的存储库实现

代码语言:javascript
复制
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
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62377870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档