package dbstart import ( "log" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-db/factory/database" ) // DBBootstrapper 数据库启动器 type DBBootstrapper struct { DBFactories map[string]*database.DBFactory // 改为map存储多个数据库实例 cfg config.IConfig } // NewDBBootstrapper 创建数据库启动器 func NewDBBootstrapper(cfg config.IConfig) *DBBootstrapper { return &DBBootstrapper{ DBFactories: make(map[string]*database.DBFactory), cfg: cfg, } } // Init 初始化默认数据库 func (db *DBBootstrapper) Init() *DBBootstrapper { if db.cfg == nil { log.Fatal("配置未初始化,请先传入配置") } // 初始化默认数据库 dbCfg := db.cfg.GetDatabase() if dbCfg == nil { log.Fatal("默认数据库配置未找到") } log.Printf("正在连接默认数据库: %s:%d/%s", dbCfg.Host, dbCfg.Port, dbCfg.Database) dbFactory, err := database.GetDefaultDBFactory() if err != nil { log.Fatalf("默认数据库连接失败: %v", err) } db.DBFactories["default"] = dbFactory log.Println("默认数据库连接成功") return db } // GetDBFactory 获取数据库工厂 func (db *DBBootstrapper) GetDBFactory(dbName string) *database.DBFactory { // 如果已经初始化,直接返回 if factory, exists := db.DBFactories[dbName]; exists { return factory } // 如果还没初始化,按需初始化 dbFactory, err := database.GetDBFactory(dbName) if err != nil { log.Printf("❌ 获取数据库 '%s' 失败: %v", dbName, err) return nil } db.DBFactories[dbName] = dbFactory return dbFactory } // GetDefaultDBFactory 获取默认数据库工厂 func (db *DBBootstrapper) GetDefaultDBFactory() *database.DBFactory { return db.GetDBFactory("default") } // Close 关闭所有数据库连接 func (db *DBBootstrapper) Close() { for name, factory := range db.DBFactories { logger.Info("正在关闭数据库: %s, factory: %v", name, factory) if factory != nil { factory.Close() logger.Info("数据库 '%s' 连接已关闭", name) } else { logger.Error("⚠️ 警告: 数据库 '%s' 的 factory 为 nil", name) } } // 清空map db.DBFactories = make(map[string]*database.DBFactory) logger.Info("所有数据库连接已关闭.") } // 在 dbstart 包中 func (db *DBBootstrapper) OnShutdown() { db.Close() }