go mongodb

連接參數配置

package mongod

import (
	"context"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
	"time"
	"src/golangConfig"
)

var (
	MongoServiceUrl       = "172.168.1.153:27017"
	MongoDataBaseName     = "baseName"
	MongoColPacketLogName = "logName"
	MongoDataBase     *mongo.Database   = nil
	MongoPacketLogCol *mongo.Collection = nil
	MongoClient       *mongo.Client     = nil
	MongoContext      context.Context   = nil
)

type Yxtranslog struct {
	Id         primitive.ObjectID `json:"id" bson:"_id"`
	name      string             `json:"name" bson:"name"`
	.........
}

func Connect() (context.Context, error) {

	MongoServiceUrl = golangConfig.InitConfigMap["mongoServiceUrl"].(string)
	MongoDataBaseName = golangConfig.InitConfigMap["mongoDataBaseName"].(string)
	MongoColPacketLogName = golangConfig.InitConfigMap["mongoColPacketLogName"].(string)
	ctx, _ := context.WithTimeout(context.Background(), 120*time.Second)

	client, err := mongo.Connect(ctx, &options.ClientOptions{Hosts: []string{MongoServiceUrl}})

	if err != nil {
		log.Fatal(err)
		return nil, err
	}

	// Check the connection
	err = client.Ping(context.TODO(), nil)

	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	MongoContext = ctx
	MongoClient = client
	MongoDataBase = MongoClient.Database(MongoDataBaseName)
	MongoPacketLogCol = MongoDataBase.Collection(MongoColPacketLogName)

	return ctx, err
}

func Disconnect() error {
	err := MongoClient.Disconnect(context.TODO())
	if err != nil {
		log.Fatal(err)
		return err
	}
	return nil
}

func GetTransLogCollection() *mongo.Collection {
	return MongoPacketLogCol
}

func insertMany(arr []interface{}) *mongo.InsertManyResult {
	collection := GetTransLogCollection()
	resm, err := collection.InsertMany(MongoContext, arr)
	if err != nil {
		log.Fatal(err)
	}
	return resm
}

func InsertMongodb(batch []interface{}) {

	go insertMany(batch)

	//Disconnect()

}

連接初始化

dbwrite.MongodInit()

以下代碼爲批量插入數據庫(到達預設長度後,立即持久化。當最後長度不滿足後,到達一定時間插入數據庫),通過通道eventQueue操作數據

package dbwrite

import (
	"fmt"
	"time"
	"src/golangConfig"
	"src/mongod"
)

var (
	eventQueue     chan interface{}
	BatchWriteSize int
	Workers        int
	lingerTime     time.Duration
	batchProcessor = func(batch []interface{}) error {
		mongod.InsertMongodb(batch)
		return nil
	}
	errHandler = func(err error, batch []interface{}) {
		fmt.Println("some error happens")
	}
)

func setWorkers() {
	for i := 0; i < Workers; i++ {
		go func() {
			var batch []interface{}
			lingerTimer := time.NewTimer(5 * time.Second)
			if !lingerTimer.Stop() {
				<-lingerTimer.C
			}
			defer lingerTimer.Stop()

			for {
				select {
				case msg := <-eventQueue:
					batch = append(batch, msg)
					if len(batch) != BatchWriteSize {
						if len(batch) == 1 {
							lingerTimer.Reset(lingerTime)
						}
						break
					}

					if err := batchProcessor(batch); err != nil {
						errHandler(err, batch)
					}

					if !lingerTimer.Stop() {
						<-lingerTimer.C
					}

					batch = make([]interface{}, 0)
				case <-lingerTimer.C:
					if err := batchProcessor(batch); err != nil {
						errHandler(err, batch)
					}

					batch = make([]interface{}, 0)
				}
			}
		}()
	}
}

func PushMongodElement(e interface{}) {
	eventQueue <- e
}

func MongodInit() {
	eventQueue = make(chan interface{}, golangConfig.InitConfigMap["mongodEventQueueCache"].(int))
	BatchWriteSize = golangConfig.InitConfigMap["mongodBatchWriteSize"].(int)
	Workers = golangConfig.InitConfigMap["mongodWorkers"].(int)
	lingerTime = golangConfig.InitConfigMap["mongodLingerTime"].(time.Duration)
	mongod.Connect()
	setWorkers()
}

向通道eventQueue存入值 

json := bson.M{"name": name.....}
dbwrite.PushMongodElement(json)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章