package data import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "time" "voucher/internal/conf" ) type GormDb struct { Client *gorm.DB } func NewGormDb(c *conf.Bootstrap) (*GormDb, func()) { db1, mf := db(c.Data.Db) cleanup := func() { mf() } return &GormDb{ Client: db1, }, cleanup } func db(data *conf.Data_Database) (*gorm.DB, func()) { mysqlConn, err := sql.Open(data.Driver, data.Source) gormDB, err := gorm.Open( mysql.New( mysql.Config{ Conn: mysqlConn, }, ), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }, ) if err != nil { panic("failed to connect database " + err.Error()) } sqlDB, err := gormDB.DB() if err != nil { panic("failed to gormDB " + err.Error()) } //sqlDB.SetMaxIdleConns(int(data.MaxIdle)) sqlDB.SetMaxIdleConns(1000) //sqlDB.SetMaxOpenConns(int(data.MaxOpen)) sqlDB.SetMaxOpenConns(3000) //sqlDB.SetConnMaxLifetime(1 * time.Hour) sqlDB.SetConnMaxLifetime(1 * time.Hour) sqlDB.SetConnMaxIdleTime(15 * time.Minute) return gormDB, func() { if mysqlConn != nil { fmt.Println("关闭 db") if err := mysqlConn.Close(); err != nil { fmt.Printf("关闭 db 失败:%v", err) } } } }