소스 검색

多数据库测试通过

qdy 2 달 전
부모
커밋
9761f73de4
5개의 변경된 파일158개의 추가작업 그리고 71개의 파일을 삭제
  1. 76
    66
      factory/database/db_factory.go
  2. 77
    0
      factory/database/dbs_factory.go
  3. 2
    2
      functions/testConnection.go
  4. 1
    1
      go.mod
  5. 2
    2
      go.sum

+ 76
- 66
factory/database/db_factory.go 파일 보기

@@ -30,87 +30,97 @@ var (
30 30
 
31 31
 // CreateDBFactory 获取数据库工厂单例
32 32
 func CreateDBFactory(cfg config.IConfig) *DBFactory {
33
+
33 34
 	config := cfg.GetDatabaseConfig()
34 35
 	instanceDBOnce.Do(func() {
35 36
 
36
-		if config == nil {
37
-			log.Fatal("配置未初始化,请先在yaml进行配置")
38
-		}
37
+		instanceDB, initErrDB = createDBFactoryNew(config)
39 38
 
40
-		// 设置默认值
41
-		if config.MaxOpenConns == 0 {
42
-			config.MaxOpenConns = 100
43
-		}
44
-		if config.MaxIdleConns == 0 {
45
-			config.MaxIdleConns = 10
46
-		}
47
-		if config.ConnMaxLifetime == 0 {
48
-			config.ConnMaxLifetime = 5 * 60 // 5分钟,单位秒
49
-		}
39
+	})
50 40
 
51
-		// 验证配置
52
-		if config.Type == "" {
53
-			initErrDB = fmt.Errorf("database type must be configured")
54
-			return
55
-		}
56
-		if config.Host == "" {
57
-			initErrDB = fmt.Errorf("database host must be configured")
58
-			return
59
-		}
60
-		if config.Database == "" {
61
-			initErrDB = fmt.Errorf("database name must be configured")
62
-			return
63
-		}
41
+	if initErrDB != nil {
42
+		log.Fatalf("DBFactory is error: '%v'", initErrDB)
43
+	}
64 44
 
65
-		log.Printf("Creating database connection...")
45
+	return instanceDB
46
+}
66 47
 
67
-		// 获取对应的驱动
68
-		dbDriver, err := drivers.Get(config.Type)
69
-		if err != nil {
70
-			initErrDB = fmt.Errorf("failed to get database driver: %v", err)
71
-			return
72
-		}
48
+// createDBFactoryNew 获取数据库工厂单例
49
+func createDBFactoryNew(config *subconfigs.DatabaseConfig) (*DBFactory, error) {
73 50
 
74
-		// 将内部 DBConfig 转换为 drivers.DBConfig
75
-		driverConfig := drivers.DBConfig{
76
-			Type:            config.Type,
77
-			Host:            config.Host,
78
-			Port:            config.Port,
79
-			Username:        config.Username,
80
-			Password:        config.Password,
81
-			Database:        config.Database,
82
-			MaxOpenConns:    config.MaxOpenConns,
83
-			MaxIdleConns:    config.MaxIdleConns,
84
-			ConnMaxLifetime: config.ConnMaxLifetime,
85
-		}
51
+	if config == nil {
52
+		log.Fatal("配置未初始化,请先在yaml进行配置")
53
+	}
86 54
 
87
-		// 创建数据库连接
88
-		db, err := dbDriver.Open(driverConfig)
89
-		if err != nil {
90
-			initErrDB = fmt.Errorf("failed to open database connection: %v", err)
91
-			return
92
-		}
55
+	// 设置默认值
56
+	if config.MaxOpenConns == 0 {
57
+		config.MaxOpenConns = 100
58
+	}
59
+	if config.MaxIdleConns == 0 {
60
+		config.MaxIdleConns = 10
61
+	}
62
+	if config.ConnMaxLifetime == 0 {
63
+		config.ConnMaxLifetime = 5 * 60 // 5分钟,单位秒
64
+	}
93 65
 
94
-		// 测试连接
95
-		if err := functions.TestConnection(db, config.Type); err != nil {
96
-			db.Close()
97
-			initErrDB = fmt.Errorf("database connection test failed: %v", err)
98
-			return
99
-		}
66
+	// 验证配置
67
+	if config.Type == "" {
68
+		initErrDB = fmt.Errorf("database type must be configured")
69
+		return nil, initErrDB
70
+	}
71
+	if config.Host == "" {
72
+		initErrDB = fmt.Errorf("database host must be configured")
73
+		return nil, initErrDB
74
+	}
75
+	if config.Database == "" {
76
+		initErrDB = fmt.Errorf("database name must be configured")
77
+		return nil, initErrDB
78
+	}
100 79
 
101
-		log.Printf("DBFactory is successfully created.\n")
80
+	log.Printf("Creating database connection...")
102 81
 
103
-		instanceDB = &DBFactory{
104
-			db:     db,
105
-			config: config,
106
-		}
107
-	})
82
+	// 获取对应的驱动
83
+	dbDriver, err := drivers.Get(config.Type)
84
+	if err != nil {
85
+		initErrDB = fmt.Errorf("failed to get database driver: %v", err)
86
+		return nil, initErrDB
87
+	}
108 88
 
109
-	if initErrDB != nil {
110
-		log.Fatalf("DBFactory is error: '%v'", initErrDB)
89
+	// 将内部 DBConfig 转换为 drivers.DBConfig
90
+	driverConfig := drivers.DBConfig{
91
+		Type:            config.Type,
92
+		Host:            config.Host,
93
+		Port:            config.Port,
94
+		Username:        config.Username,
95
+		Password:        config.Password,
96
+		Database:        config.Database,
97
+		MaxOpenConns:    config.MaxOpenConns,
98
+		MaxIdleConns:    config.MaxIdleConns,
99
+		ConnMaxLifetime: config.ConnMaxLifetime,
111 100
 	}
112 101
 
113
-	return instanceDB
102
+	// 创建数据库连接
103
+	db, err := dbDriver.Open(driverConfig)
104
+	if err != nil {
105
+		initErrDB = fmt.Errorf("failed to open database connection: %v", err)
106
+		return nil, initErrDB
107
+	}
108
+
109
+	// 测试连接
110
+	if err := functions.TestConnection(db, config.Type); err != nil {
111
+		db.Close()
112
+		initErrDB = fmt.Errorf("database connection test failed: %v", err)
113
+		return nil, initErrDB
114
+	}
115
+
116
+	log.Printf("DBFactory is successfully created.\n")
117
+
118
+	instanceDB = &DBFactory{
119
+		db:     db,
120
+		config: config,
121
+	}
122
+
123
+	return instanceDB, initErrDB
114 124
 }
115 125
 
116 126
 // ========== DBFactory 实例方法 ==========

+ 77
- 0
factory/database/dbs_factory.go 파일 보기

@@ -0,0 +1,77 @@
1
+package database
2
+
3
+import (
4
+	"fmt"
5
+	"log"
6
+	"sync"
7
+
8
+	"git.x2erp.com/qdy/go-base/config"
9
+)
10
+
11
+// DBSFactory 多数据库工厂管理器
12
+type DBSFactory struct {
13
+	factories map[string]*DBFactory // 存储多个数据库工厂
14
+	config    config.IConfig
15
+	mu        sync.RWMutex // 并发安全锁
16
+}
17
+
18
+var (
19
+	// 全局单例的多数据库工厂管理器
20
+	dbsFactoryInstance     *DBSFactory
21
+	dbsFactoryInstanceOnce sync.Once
22
+)
23
+
24
+// CreateDBSFactory 获取多数据库工厂管理器单例
25
+func CreateDBSFactory(cfg config.IConfig) *DBSFactory {
26
+	dbsFactoryInstanceOnce.Do(func() {
27
+		dbsFactoryInstance = &DBSFactory{
28
+			factories: make(map[string]*DBFactory),
29
+			config:    cfg,
30
+		}
31
+		log.Println("DBSFactory initialized.")
32
+	})
33
+	return dbsFactoryInstance
34
+}
35
+
36
+// ========== DBSFactory 实例方法 ==========
37
+
38
+// / CreateDBFactory 创建指定名称的数据库工厂
39
+func (d *DBSFactory) CreateDBFactory(name string) (*DBFactory, error) {
40
+	d.mu.Lock()
41
+	defer d.mu.Unlock()
42
+
43
+	// 如果已存在,直接返回
44
+	if factory := d.factories[name]; factory != nil {
45
+		return factory, nil
46
+	}
47
+
48
+	dbConfig, _ := d.config.GetDbsConfig(name)
49
+	if dbConfig == nil {
50
+		return nil, fmt.Errorf("数据库配置 '%s' 不存在", name)
51
+	}
52
+
53
+	factory, err := createDBFactoryNew(dbConfig)
54
+	if err != nil {
55
+		return nil, fmt.Errorf("创建数据库工厂 '%s' 失败: %v", name, err)
56
+	}
57
+
58
+	d.factories[name] = factory
59
+	return factory, nil
60
+}
61
+
62
+// Close 关闭所有数据库工厂
63
+func (d *DBSFactory) Close() {
64
+	d.mu.Lock()
65
+	defer d.mu.Unlock()
66
+
67
+	for name, factory := range d.factories {
68
+		log.Printf("Closing DBFactory '%s'...", name)
69
+		factory.Close()
70
+	}
71
+	d.factories = make(map[string]*DBFactory)
72
+	log.Println("All DBFactory instances closed.")
73
+}
74
+
75
+func (f *DBSFactory) GetName() string {
76
+	return "DBSFactory"
77
+}

+ 2
- 2
functions/testConnection.go 파일 보기

@@ -26,9 +26,9 @@ func TestConnection(db *sqlx.DB, dbType string) error {
26 26
 	}
27 27
 
28 28
 	if result != 1 {
29
-		return fmt.Errorf("unexpected test result: %d", result)
29
+		return fmt.Errorf("%s unexpected test result: %d", dbType, result)
30 30
 	}
31 31
 
32
-	log.Println("test Connection  database is success.")
32
+	log.Printf("test Connection  database is success. %s", dbType)
33 33
 	return nil
34 34
 }

+ 1
- 1
go.mod 파일 보기

@@ -4,7 +4,7 @@ module git.x2erp.com/qdy/go-db
4 4
 go 1.25.4
5 5
 
6 6
 require (
7
-	git.x2erp.com/qdy/go-base v0.1.12-20251231-1
7
+	git.x2erp.com/qdy/go-base v0.1.13-20251231-1
8 8
 	github.com/go-sql-driver/mysql v1.9.3
9 9
 	github.com/lib/pq v1.10.9
10 10
 	github.com/microsoft/go-mssqldb v1.9.4

+ 2
- 2
go.sum 파일 보기

@@ -1,7 +1,7 @@
1 1
 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2 2
 filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3
-git.x2erp.com/qdy/go-base v0.1.12-20251231-1 h1:xcEdI8zKVNJA50e6Q3fACD3qJH6HAORZyejnvkz2n/I=
4
-git.x2erp.com/qdy/go-base v0.1.12-20251231-1/go.mod h1:bhbWJO4/dxNNjXjie1E0G41pvKEEm2dPnRXRzYnV9tU=
3
+git.x2erp.com/qdy/go-base v0.1.13-20251231-1 h1:lalbX9ZF8oFv2f5OV7Uxc85UGD5lb1M45YS3uSrBCJk=
4
+git.x2erp.com/qdy/go-base v0.1.13-20251231-1/go.mod h1:bhbWJO4/dxNNjXjie1E0G41pvKEEm2dPnRXRzYnV9tU=
5 5
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
6 6
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
7 7
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=

Loading…
취소
저장