1 Star 0 Fork 0

leovs/yc-go-sdk

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
database.go 2.82 KB
一键复制 编辑 原始数据 按行查看 历史
leovs 提交于 2024-12-14 20:56 +08:00 . first commit
// Copyright 2023 ztlcloud.com
// leovs @2023.12.12
package conf
import (
"gitee.com/leovs/yc-go-sdk/middleware/cache"
"gitee.com/leovs/yc-go-sdk/sdk"
"gitee.com/leovs/yc-go-sdk/utils"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/plugin/dbresolver"
"log"
"os"
"time"
)
type DatabaseConfig struct {
Separation bool `yaml:"separation"` // 是否开启读写分离
MaxIdle int `yaml:"maxIdle"` // 最大空闲连接数
MaxOpen int `yaml:"maxOpen"` // 最大打开连接数
Master string `yaml:"master"` // 主库
Dynamic map[string]string `yaml:"dynamic"` // 动态库
Slave []string `yaml:"slave"` // 从库
Cache cache.Gorm2CacheConfig `yaml:"cache"` // 缓存配置
}
// Init 初始化配置
func (e *DatabaseConfig) Init(_config *Settings) {
// 是否打开数据库
if e == nil || e.Master == "" {
return
}
log.Printf("[%v] 正在连接数据库\n", _config.AppName)
LogLevel := utils.Ternary(_config.Mode == "debug", logger.Info, logger.Warn).(logger.LogLevel)
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: LogLevel, // Log level
Colorful: false, // 禁用彩色打印
},
)
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: e.Master,
}), &gorm.Config{Logger: newLogger, PrepareStmt: true, SkipDefaultTransaction: false})
if err != nil {
log.Panicf("数据库连接失败 %v\n", err.Error())
return
}
var replicas []gorm.Dialector
for i, s := range e.Slave {
log.Printf("读写分离-%d-%s \n", i, s)
replicas = append(replicas, mysql.New(mysql.Config{DSN: s}))
}
err = db.Use(
dbresolver.Register(dbresolver.Config{
Sources: []gorm.Dialector{mysql.New(mysql.Config{
DSN: e.Master,
})},
Replicas: replicas,
Policy: dbresolver.RandomPolicy{},
}).
SetConnMaxIdleTime(time.Hour).
SetConnMaxLifetime(24 * time.Hour).
SetMaxIdleConns(e.MaxIdle).
SetMaxOpenConns(e.MaxOpen),
)
if err != nil {
log.Panicf("数据库连接失败 %v\n", err.Error())
return
}
// 配置动态库
for k, v := range e.Dynamic {
log.Printf("动态库-%s-%s \n", k, v)
db2, err := gorm.Open(mysql.New(mysql.Config{DSN: v}), &gorm.Config{
Logger: newLogger, PrepareStmt: true, SkipDefaultTransaction: false,
})
if err != nil {
log.Panicf("动态数据库连接失败 %v\n", err.Error())
} else {
sdk.Runtime.SetDynamicDb(k, db2)
}
}
// 配置缓存
if e.Cache.Enable {
err := db.Use(&cache.Gorm2Cache{Config: e.Cache})
if err != nil {
log.Panicf("数据库缓存初始化失败 %v\n", err.Error())
return
}
log.Println("数据库缓存初始化成功")
}
sdk.Runtime.SetDb(db)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/leovs/yc-go-sdk.git
git@gitee.com:leovs/yc-go-sdk.git
leovs
yc-go-sdk
yc-go-sdk
v1.2.3

搜索帮助