var (
mgoClient *qmgo.Client
mgoClientOnce sync.Once
)
func mgoConnConfig() *qmgo.Config {
cfg := "定义好的配置文件解析之后的struct"
// logger.Infof("mgo cfg raw:%+v", cfg)
mode, err := readpref.ModeFromString(cfg.ReadPref.Mode)
if err != nil {
log.Panicf("Init MgoConnConfig failed: %+v", err)
}
config := &qmgo.Config{
// URI example: [mongodb://][user:pass@]host1[:port1][,host2[:port2],...][/database][?options]
Uri: fmt.Sprintf("mongodb://%s:%s@%s", cfg.User, cfg.Password, strings.Join(cfg.ServerNodes, ",")),
Database: cfg.Database,
ConnectTimeoutMS: &cfg.ConnectTimeoutMS,
SocketTimeoutMS: &cfg.SocketTimeoutMS,
MaxPoolSize: &cfg.MaxPoolSize,
MinPoolSize: &cfg.MinPoolSize,
ReadPreference: &qmgo.ReadPref{
Mode: mode,
},
Auth: &qmgo.Credential{
AuthSource: cfg.Auth.AuthSource,
},
}
return config
}
func mgoLazyinit() {
stringfy := func(evt *event.PoolEvent) string {
var opts string
if evt.PoolOptions != nil {
buf, _ := json.Marshal(evt.PoolOptions)
opts = string(buf)
}
return fmt.Sprintf("addr:%s, opts:%s, reason:%s", evt.Address, opts, evt.Reason)
}
mgoClientOnce.Do(func() {
logger.Info("lazyinit mgoClient")
poolMonitor := &event.PoolMonitor{
Event: func(evt *event.PoolEvent) {
switch evt.Type {
case event.PoolCreated:
logger.Infof("mgoClient: PoolCreated, %s", stringfy(evt))
case event.PoolReady:
logger.Infof("mgoClient: PoolReady, %s", stringfy(evt))
case event.PoolCleared:
logger.Infof("mgoClient: PoolCleared, %s", stringfy(evt))
case event.GetSucceeded:
logger.Infof("mgoClient: GetSucceeded, %s", stringfy(evt))
case event.GetFailed:
logger.Errorf("mgoClient: GetFailed, %s", stringfy(evt))
case event.ConnectionClosed:
logger.Infof("mgoClient: ConnectionClosed, %s", stringfy(evt))
case event.PoolClosedEvent:
logger.Warningf("mgoClient: PoolClosedEvent, %s", stringfy(evt))
}
},
}
clientOpt := options.ClientOptions{
ClientOptions: mgoDriverOptions.Client().
// SetMaxConnIdleTime specifies the maximum amount of time that a connection will remain idle in a connection pool before it is removed from the pool and closed.
SetMaxConnIdleTime(time.Millisecond * time.Duration(1000)).
// SetPoolMonitor specifies a PoolMonitor to receive connection pool events.
SetPoolMonitor(poolMonitor),
}
var err error
mgoClient, err = qmgo.NewClient(context.Background(), mgoConnConfig(), clientOpt)
if err != nil {
logger.Errorf("lazyinit qmgo.NewClient error: %v", err)
log.Panicf("lazyinit qmgo.NewClient error: %v", err)
}
})
}
func GetMgoCollection(tableName string) *qmgo.Collection {
mgoLazyinit()
return mgoClient.Database("db").Collection(tableName)
}```
SetMaxConnIdleTime 在这里并不生效,请问是为啥?