Files
cdle da24a7ab97 x
2023-06-14 15:01:14 +08:00

85 lines
1.5 KiB
Go

package mongodb
import (
"context"
"errors"
"sync"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// MongoDB连接池
type MongoDBPool struct {
clients map[string]*mongo.Client // 客户端连接map
mutex sync.Mutex // 互斥锁
}
var p *MongoDBPool
// 创建一个新的MongoDB连接池
func NewMongoDBPool() *MongoDBPool {
return &MongoDBPool{
clients: make(map[string]*mongo.Client),
}
}
// 获取一个MongoDB客户端连接
func GetClient(uri string) (*mongo.Client, error) {
if p == nil {
p = NewMongoDBPool()
}
// 加锁
p.mutex.Lock()
defer p.mutex.Unlock()
// 检查连接是否存在
if client, ok := p.clients[uri]; ok {
return client, nil
}
// 创建新的连接
client, err := mongo.NewClient(options.Client().ApplyURI(uri))
if err != nil {
return nil, err
}
// 连接数据库
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err = client.Connect(ctx)
if err != nil {
return nil, err
}
// 保存连接
p.clients[uri] = client
return client, nil
}
// 关闭一个MongoDB客户端连接
func CloseClient(uri string) error {
// 加锁
p.mutex.Lock()
defer p.mutex.Unlock()
// 检查连接是否存在
if client, ok := p.clients[uri]; ok {
// 关闭连接
err := client.Disconnect(context.Background())
if err != nil {
return err
}
// 删除连接
delete(p.clients, uri)
return nil
}
return errors.New("client not found")
}