我目前是从MongoDB on GoLang开始的。我目前的用例是这样的。
我希望在一个特定的包中初始化到我的MongoDB Database的连接,并在其他几个本地包中使用返回的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以获得一个client是否安全?
非常感谢。
发布于 2020-06-14 20:39:02
您不必一次又一次地给InitDataLayer打电话。您只需要创建一个客户端,就可以使用同一个客户端从不同的地方连接到Mongo。
Mongo客户端在内部维护一个连接池,因此您不必一次又一次地创建这个客户机。
将此客户端存储为struct字段并继续重用它是一个很好的设计。
编辑:
创建连接
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())
...
}存储库/DAL,在存储库结构中存储客户端
接口
type BookRepository interface {
FindById( ctx context.Context, id int) (*Book, error)
}在struct中存储客户端的存储库实现
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
}https://stackoverflow.com/questions/62377870
复制相似问题