package main import ( "database/sql" "errors" "fmt" "log" "sync" "time" _ "github.com/go-sql-driver/mysql" "github.com/redis/go-redis/v9" ) type DBManager struct { MySQL *sql.DB Redis *redis.Client } // dbInstance holds the single instance of DBManager var dbInstance *DBManager var oncedb sync.Once // GetDBManager provides a global access point to the DBManager instance func GetDBManager() (*DBManager, error) { oncedb.Do(func() { config, _ := GetConfigManager() dbInstance = &DBManager{} initError = initDBManager(dbInstance, config) }) return dbInstance, initError } // initDBManager initializes the DBManager instance with database connections func initDBManager(dbManager *DBManager, config *ConfigManager) error { // 初始化 MySQL 连接 //dsn := "username:password@tcp(localhost:3306)/aigrammar?parseTime=true" dsn := fmt.Sprintf("%s:%s@tcp(%s)/aigrammar?parseTime=true", config.GetDatabaseConfig().MysqlUser, config.GetDatabaseConfig().MysqlPass, config.GetDatabaseConfig().MysqlConn, ) db, err := sql.Open("mysql", dsn) if err != nil { log.Fatalf("Error opening MySQL database: %v", err) return errors.New("Error opening MySQL database:") } db.SetMaxOpenConns(25) db.SetMaxIdleConns(10) db.SetConnMaxLifetime(time.Minute * 5) dbManager.MySQL = db // 初始化 Redis 连接 rdb := redis.NewClient(&redis.Options{ Addr: config.GetDatabaseConfig().RedisConn, Password: "", // no password set DB: 0, // use default DB PoolSize: 10, // 连接池大小 }) dbManager.Redis = rdb return nil } func (db *DBManager) CloseDB() { db.MySQL.Close() db.Redis.Close() } /* func NewDBManager(config *ConfigManager) (*DBManager, error) { dbManager := &DBManager{} // 初始化 MySQL 连接 //dsn := "username:password@tcp(localhost:3306)/aigrammar?parseTime=true" dsn := fmt.Sprintf("%s:%s@tcp(%s)/aigrammar?parseTime=true", config.GetDatabaseConfig().MysqlUser, config.GetDatabaseConfig().MysqlPass, config.GetDatabaseConfig().MysqlConn, ) db, err := sql.Open("mysql", dsn) if err != nil { log.Fatalf("Error opening MySQL database: %v", err) return nil, errors.New("Error opening MySQL database: %v", err) } db.SetMaxOpenConns(25) db.SetMaxIdleConns(10) db.SetConnMaxLifetime(time.Minute * 5) dbManager.MySQL = db // 初始化 Redis 连接 rdb := redis.NewClient(&redis.Options{ Addr: config.GetDatabaseConfig().RedisConn, Password: "", // no password set DB: 0, // use default DB PoolSize: 10, // 连接池大小 }) dbManager.Redis = rdb return dbManager, nil } func (db *DBManager) CloseDB() { db.MySQL.Close() db.Redis.Close() } */