1 回答
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
}
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报