| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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"
- }
|