package db import ( "context" "database/sql" "fmt" "log" "time" // 导入MySQL驱动 _ "github.com/go-sql-driver/mysql" ) // MySQLDB MySQL数据库连接结构体 type MySQLDB struct { baseDB } // NewMySQLDB 创建MySQL数据库连接实例 func NewMySQLDB(cfg Config) (DB, error) { // 构建MySQL连接字符串 // 格式: username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Database, cfg.Charset) // 打开数据库连接 db, err := sql.Open("mysql", dsn) if err != nil { return nil, fmt.Errorf("failed to open mysql connection: %w", err) } // 配置连接池 db.SetMaxOpenConns(20) // 最大打开连接数 db.SetMaxIdleConns(10) // 最大空闲连接数 db.SetConnMaxLifetime(30 * time.Minute) // 连接最大生命周期 db.SetConnMaxIdleTime(10 * time.Minute) // 连接最大空闲时间 // 测试连接 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := db.PingContext(ctx); err != nil { return nil, fmt.Errorf("failed to ping mysql: %w", err) } log.Println("MySQL connection established successfully") return &MySQLDB{ baseDB: baseDB{db: db}, }, nil }