package mysql import ( "errors" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "gorm.io/plugin/dbresolver" ) var ( _db *gorm.DB _conf *Config ) type Config struct { ConnString string ConnMaxLifetime int64 //ConnMaxLifetime 最大连接时间,单位:小时 MaxIdleConns int MaxOpenConns int InitTable bool } // Init mysql初始化 func Init(config *Config) { if config == nil { config = &Config{ MaxIdleConns: 10, MaxOpenConns: 100, } } if config.ConnString == "" { config.ConnString = "root:root@tcp(127.0.0.1:3306)/mysql?charset=utf8&parseTime=True&loc=Local" } if config.ConnMaxLifetime < 1 { config.ConnMaxLifetime = 1 } if config.ConnMaxLifetime > 6 { config.ConnMaxLifetime = 6 } if config.MaxIdleConns < 1 { config.MaxIdleConns = 1 } if config.MaxIdleConns > 50 { config.MaxIdleConns = 50 } if config.MaxOpenConns < 1 { config.MaxOpenConns = 1 } if config.MaxOpenConns > 500 { config.MaxOpenConns = 500 } _conf = config } // New 创建实例 func New() (*gorm.DB, error) { if _db != nil { return _db, nil } if _conf == nil { return nil, errors.New("组件未初始化,请执行Init!") } var err error _db, err = gorm.Open(mysql.Open(_conf.ConnString), &gorm.Config{ SkipDefaultTransaction: true, Logger: logger.Default.LogMode(logger.Silent), NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, }) if err != nil { return nil, err } _db.Use( dbresolver.Register(dbresolver.Config{ Sources: []gorm.Dialector{mysql.Open(_conf.ConnString)}, Replicas: []gorm.Dialector{mysql.Open(_conf.ConnString)}, Policy: dbresolver.RandomPolicy{}, }).SetConnMaxIdleTime(time.Hour). SetConnMaxLifetime(time.Duration(_conf.ConnMaxLifetime) * time.Hour). SetMaxIdleConns(_conf.MaxIdleConns). SetMaxOpenConns(_conf.MaxOpenConns)) return _db, nil }