package mqttstore import ( "kpt-pasture/config" "time" "gitee.com/xuyiping_admin/pkg/logger/logrus" "gitee.com/xuyiping_admin/pkg/xerr" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gitee.com/xuyiping_admin/pkg/di" ) var Module = di.Options( di.Provide(MustNewStore), ) type DB struct { *gorm.DB } func NewStore(engine *gorm.DB) *DB { return &DB{engine} } type goRmLog struct { } func (g goRmLog) Printf(s string, i ...interface{}) { logrus.Infof(s, i...) } var newLogger = logger.New( goRmLog{}, logger.Config{ SlowThreshold: 5 * time.Second, LogLevel: logger.Info, }, ) func MustNewStore(cfg *config.AppConfig) *DB { db, err := gorm.Open(mysql.New(mysql.Config{ DriverName: cfg.StoreSetting.DriverName, DSN: cfg.StoreSetting.KptMqtt}), &gorm.Config{Logger: newLogger}, ) if err != nil { panic(xerr.WithStack(err)) } if cfg.StoreSetting.ShowSQL { db.Logger.LogMode(logger.Info) } sqlDb, _ := db.DB() sqlDb.SetMaxOpenConns(100) // 设置最大空闲连接数为10个 sqlDb.SetConnMaxIdleTime(10) // 设置可打开的最大连接数为 100 个 sqlDb.SetConnMaxLifetime(5 * time.Minute) // 5分钟 设置一个连接空闲后在多长时间内可复用,上面配置文件里设置的是300000000000, 因为Go的time.Duration底层类型是int64, 一秒是1000000000,这个大家可设置一个适当的时间,一般5~15分钟,不要太长 if err = sqlDb.Ping(); err != nil { panic(xerr.WithStack(err)) } return NewStore(db) } func MustMigrateStore(cfg *config.AppConfig) *gorm.DB { db, err := gorm.Open(mysql.New(mysql.Config{ DriverName: cfg.StoreSetting.DriverName, DSN: cfg.StoreSetting.KptMigr}), &gorm.Config{Logger: newLogger}, ) if err != nil { panic(xerr.WithStack(err)) } if cfg.StoreSetting.ShowSQL { db.Logger.LogMode(logger.Info) } sqlDb, _ := db.DB() sqlDb.SetMaxOpenConns(100) // 设置最大空闲连接数为10个 sqlDb.SetConnMaxIdleTime(10) // 设置可打开的最大连接数为 100 个 sqlDb.SetConnMaxLifetime(300000000000) // 5分钟 设置一个连接空闲后在多长时间内可复用,上面配置文件里设置的是300000000000, 因为Go的time.Duration底层类型是int64, 一秒是1000000000,这个大家可设置一个适当的时间,一般5~15分钟,不要太长 if err = sqlDb.Ping(); err != nil { panic(xerr.WithStack(err)) } return db }