go-gorm / go-gorm/dbresolver

连接数据库集群的疑问?

Open
#142 0 comments 0 reactions 1 assignee Claimed by @jinzhu View on GitHub
type:question
Dominant language
Go
Stars
538
Forks
69
PR merge metrics
No merged PRs in 30d

Description

请教连接数据库集群的用法

现在有三个数据库节点可连(分别是节点a,b,c)。
1. 在初始化的时候我要先初始化a节点的连接。
2. 用a节点连接的节点去添加plugin,plugin中的Sources和Replicas(感觉可以随便填)。
3. 把a节点再填入Sources中会又初始化一次。

```go
masterDialectors := make([]gorm.Dialector, 0)
slaveDialectors := make([]gorm.Dialector, 0)

for i, master := range cfg.MySQL.Masters {
connectionString := fmt.Sprintf("%s:%s@(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
cfg.MySQL.User,
cfg.MySQL.Pass,
master,
cfg.MySQL.DBName)

dialector := mysql.New(mysql.Config{DSN: connectionString})

if i == 0 {
masterDialector = dialector
} else {
masterDialectors = append(masterDialectors, dialector)
}
}

for _, slave := range cfg.MySQL.Slaves {
if slave == "" {
continue
}

connectionString := fmt.Sprintf("%s:%s@(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
cfg.MySQL.User,
cfg.MySQL.Pass,
slave,
cfg.MySQL.DBName)

dialector := mysql.New(mysql.Config{DSN: connectionString})

slaveDialectors = append(slaveDialectors, dialector)
}

gormConfig := &gorm.Config{
SkipDefaultTransaction: true,
Logger: logger.NewGorm(!cfg.Debug),
}

db, err = gorm.Open(masterDialector, gormConfig)
if err != nil {
log.Fatal("Fail to connect db", err)
}

err = db.Use(dbresolver.Register(dbresolver.Config{
Sources: masterDialectors,
Replicas: slaveDialectors,
Policy: dbresolver.RandomPolicy{},
}))
if err != nil {
log.Fatal("Fail to register master slave dbs", err)
}

db = db.Debug()

rawDB, _ := db.DB()
rawDB.SetMaxIdleConns(cfg.MySQL.MaxIdleConns)
rawDB.SetMaxOpenConns(cfg.MySQL.MaxOpenConns)
rawDB.SetConnMaxLifetime(time.Minute * 1)
```
设置连接数和连接的生命周期需要初始化结束后再设置,这。。。太别扭了。不知有无更优雅的方式

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.