package database import ( "fmt" "log" "sync" "git.x2erp.com/qdy/go-base/config" ) // DBSFactory 多数据库工厂管理器 type DBSFactory struct { factories map[string]*DBFactory // 存储多个数据库工厂 config config.IConfig mu sync.RWMutex // 并发安全锁 } var ( // 全局单例的多数据库工厂管理器 dbsFactoryInstance *DBSFactory dbsFactoryInstanceOnce sync.Once ) // CreateDBSFactory 获取多数据库工厂管理器单例 func CreateDBSFactory(cfg config.IConfig) *DBSFactory { dbsFactoryInstanceOnce.Do(func() { dbsFactoryInstance = &DBSFactory{ factories: make(map[string]*DBFactory), config: cfg, } log.Println("DBSFactory initialized.") }) return dbsFactoryInstance } // ========== DBSFactory 实例方法 ========== // CreateDBFactory 创建指定名称的数据库工厂 func (d *DBSFactory) CreateDBFactory(name string) (*DBFactory, error) { // 第一次检查(不加锁),如果存在直接返回 d.mu.RLock() if factory := d.factories[name]; factory != nil { d.mu.RUnlock() return factory, nil } d.mu.RUnlock() // 加锁进行创建 d.mu.Lock() defer d.mu.Unlock() // 第二次检查(加锁后),防止并发创建 if factory := d.factories[name]; factory != nil { return factory, nil } dbConfig, _ := d.config.GetDbsConfig(name) if dbConfig == nil { return nil, fmt.Errorf("数据库配置 '%s' 不存在", name) } factory, err := createDBFactoryNew(dbConfig) if err != nil { return nil, fmt.Errorf("创建数据库工厂 '%s' 失败: %v", name, err) } d.factories[name] = factory return factory, nil } // Close 关闭所有数据库工厂 func (d *DBSFactory) Close() { d.mu.Lock() defer d.mu.Unlock() for name, factory := range d.factories { log.Printf("Closing DBFactory '%s'...", name) factory.Close() } d.factories = make(map[string]*DBFactory) log.Println("All DBFactory instances closed.") } func (f *DBSFactory) GetName() string { return "DBSFactory" }