package database import ( "context" "sync" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var ( once sync.Once _globalClient *mongo.Client _globalMu sync.RWMutex ) // MongoDBClient returns the global mongoDB client.It's safe for concurrent use. func MongoDBClient() *mongo.Client { _globalMu.RLock() client := _globalClient _globalMu.RUnlock() return client } // GetMongoDBInstance return instance of mongoDB client func GetMongoDBInstance(ctx context.Context, mongoDBURI string) *mongo.Client { once.Do(func() { _globalClient = initMongoDBClient(ctx, mongoDBURI) }) return _globalClient } // initMongoDBClient return successfully initialized mongoDB client func initMongoDBClient(ctx context.Context, mongoDBURI string) *mongo.Client { ctx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() mongoDBClient, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoDBURI)) if err != nil { panic(err) } return mongoDBClient }