package mysql import ( "fmt" "log" "os" "time" "mini-chat/configs" "mini-chat/internal/pkg/errors" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" ) var _ Repo = (*dbRepo)(nil) type Repo interface { i() GetDbR() *gorm.DB GetDbW() *gorm.DB DbRClose() error DbWClose() error } type dbRepo struct { DbR *gorm.DB DbW *gorm.DB } func New() (Repo, error) { cfg := configs.Get().MySQL dbr, err := dbConnect(cfg.Read.User, cfg.Read.Pass, cfg.Read.Addr, cfg.Read.Name) if err != nil { return nil, err } dbw, err := dbConnect(cfg.Write.User, cfg.Write.Pass, cfg.Write.Addr, cfg.Write.Name) if err != nil { return nil, err } return &dbRepo{ DbR: dbr, DbW: dbw, }, nil } func (d *dbRepo) i() {} func (d *dbRepo) GetDbR() *gorm.DB { return d.DbR } func (d *dbRepo) GetDbW() *gorm.DB { return d.DbW } func (d *dbRepo) DbRClose() error { sqlDB, err := d.DbR.DB() if err != nil { return err } return sqlDB.Close() } func (d *dbRepo) DbWClose() error { sqlDB, err := d.DbW.DB() if err != nil { return err } return sqlDB.Close() } func dbConnect(user, pass, addr, dbName string) (*gorm.DB, error) { dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s&sql_mode=TRADITIONAL", user, pass, addr, dbName, true, "Local") newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer logger.Config{ SlowThreshold: time.Second, // Slow SQL threshold LogLevel: logger.Warn, // Log level IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger ParameterizedQueries: true, // Don't include params in the SQL log Colorful: false, // Disable color }, ) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, Logger: newLogger, // 日志配置 }) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("[db connection failed] Database name: %s", dbName)) } db.Set("gorm:table_options", "CHARSET=utf8mb4") sqlDB, err := db.DB() if err != nil { return nil, err } // 设置连接池 用于设置最大打开的连接数,默认值为0表示不限制.设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。 sqlDB.SetMaxOpenConns(100) // 设置最大连接数 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。 sqlDB.SetMaxIdleConns(5) // 设置最大连接超时 sqlDB.SetConnMaxLifetime(time.Minute * 2) // 使用插件 err = db.Use(&TracePlugin{}) if err != nil { return nil, err } return db, nil }