-
Notifications
You must be signed in to change notification settings - Fork 0
/
mgr.go
84 lines (73 loc) · 1.56 KB
/
mgr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package db
import (
"context"
"fmt"
"gorm.io/gorm"
"sync"
)
// Config config
type Config struct {
DriverName string `json:"DriverName" yaml:"DriverName"`
UUID string `json:"UUID" yaml:"UUID"`
DSN string `json:"DSN" yaml:"DSN"`
Database string `json:"Database" yaml:"Database"`
}
// 不采用懒加载方式的目的在于, 尽可能早的把问题暴露出来, 配置的数据库信息必须是正确的,否在程序会Panic
type dbmgr struct {
mux *sync.RWMutex
dbs map[string]*DB
}
// Load Load
func (mgr *dbmgr) Load(configs ...Config) error {
mgr.mux.Lock()
defer mgr.mux.Unlock()
for _, config := range configs {
if config.UUID == "" || config.DSN == "" {
panic(fmt.Sprintf("config is invalid, config=%#v", config))
}
db, err := New(config.DriverName, config.DSN)
if err != nil {
return err
}
if err := db.SetMaxOpenConns(400); err != nil {
return err
}
mgr.dbs[config.UUID] = db
}
return nil
}
// Get get
func (mgr *dbmgr) Get(uuid string) *DB {
mgr.mux.RLock()
defer mgr.mux.RUnlock()
storage, ok := mgr.dbs[uuid]
if !ok {
panic(fmt.Sprintf("uuid=%s not found", uuid))
}
return storage
}
var mgr *dbmgr
func init() {
mgr = &dbmgr{
mux: &sync.RWMutex{},
dbs: make(map[string]*DB),
}
}
// Load Load
func Load(config Config) error {
return mgr.Load(config)
}
func Get(uuid string) *DB {
return mgr.Get(uuid)
}
// GetDB GetDB
func GetDB(ctx context.Context, uuid string) *gorm.DB {
return mgr.Get(uuid).DB(ctx)
}
// Close connection
func Close() error {
for _, db := range mgr.dbs {
db.Close()
}
return nil
}