package mongodb
// 使用连接池
import (
"context"
"fmt"
"log"
"sync"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
const (
maxConnections = 30 // 最大连接数
)
var (
connectionPool chan *mongo.Client
poolMutex sync.Mutex
)
// 初始化连接池
func InitConnectionPool() error {
poolMutex.Lock()
defer poolMutex.Unlock()
if connectionPool != nil {
return fmt.Errorf("连接池已初始化")
}
connectionPool = make(chan *mongo.Client, maxConnections)
for i := 0; i < maxConnections; i++ {
client, err := CreateMongoClient()
if err != nil {
return err
}
// 创建出的连接缓存在通道中
connectionPool <- client
}
return nil
}
// 创建新的 MongoDB 连接
func CreateMongoClient() (*mongo.Client, error) {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
ctx := context.TODO()
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
return nil, err
}
return client, nil
}
// 获取 MongoDB 连接
func GetMongoClientFromPool() (*mongo.Client, error) {
select {
// TODO 从缓存通道获取连接
case client := <-connectionPool:
return client, nil
default:
return nil, fmt.Errorf("连接池已满")
}
}
// 释放 MongoDB 连接回连接池
func ReleaseMongoClientToPool(client *mongo.Client) {
connectionPool <- client
}
// 使用连接池执行 MongoDB 操作
func GetMongodbConnection() (*mongo.Client, *mongo.Collection) {
// 初始化
InitErr := InitConnectionPool()
if InitErr != nil {
log.Fatal(InitErr)
}
// 从连接池获取连接使用
client, err := GetMongoClientFromPool()
if err != nil {
log.Fatal(err)
}
// 操作指定的数据表
collection := client.Database("dbname").Collection("collection")
return client, collection
}
golang Mongodb简易连接池使用
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 版本golang -- 1.12.4mongodb -- 4.0go driver -- 1.0.0 简介 mon...
- 版本golang -- 1.12.4mongodb -- 4.0go driver -- 1.0.0 简介 在上一...
- 本篇包括如下内容: ** 1,JDBC及封装,** 2,DBUtil使用, 3,自定义连接池, 4,c3p0和db...