Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 25s
feat(admin): 新增工会管理功能 feat(activity): 添加活动管理相关服务 feat(user): 实现用户道具卡和积分管理 feat(guild): 新增工会成员管理功能 fix: 修复数据库连接配置 fix: 修正jwtoken导入路径 fix: 解决端口冲突问题 style: 统一代码格式和注释风格 style: 更新项目常量命名 docs: 添加项目框架和开发规范文档 docs: 更新接口文档注释 chore: 移除无用代码和文件 chore: 更新Makefile和配置文件 chore: 清理日志文件 test: 添加道具卡测试脚本
132 lines
2.7 KiB
Go
132 lines
2.7 KiB
Go
package mysql
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"os"
|
||
"time"
|
||
|
||
"bindbox-game/configs"
|
||
"bindbox-game/internal/pkg/errors"
|
||
|
||
"gorm.io/driver/mysql"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/logger"
|
||
"gorm.io/gorm/schema"
|
||
)
|
||
|
||
var _ Repo = (*dbRepo)(nil)
|
||
|
||
type Repo interface {
|
||
i()
|
||
GetDbR() *gorm.DB
|
||
GetDbW() *gorm.DB
|
||
DbRClose() error
|
||
DbWClose() error
|
||
}
|
||
|
||
type dbRepo struct {
|
||
DbR *gorm.DB
|
||
DbW *gorm.DB
|
||
}
|
||
|
||
func New() (Repo, error) {
|
||
cfg := configs.Get().MySQL
|
||
dbr, err := dbConnect(cfg.Read.User, cfg.Read.Pass, cfg.Read.Addr, cfg.Read.Name)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
dbw, err := dbConnect(cfg.Write.User, cfg.Write.Pass, cfg.Write.Addr, cfg.Write.Name)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &dbRepo{
|
||
DbR: dbr,
|
||
DbW: dbw,
|
||
}, nil
|
||
}
|
||
|
||
func (d *dbRepo) i() {}
|
||
|
||
func (d *dbRepo) GetDbR() *gorm.DB {
|
||
return d.DbR
|
||
}
|
||
|
||
func (d *dbRepo) GetDbW() *gorm.DB {
|
||
return d.DbW
|
||
}
|
||
|
||
func (d *dbRepo) DbRClose() error {
|
||
sqlDB, err := d.DbR.DB()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return sqlDB.Close()
|
||
}
|
||
|
||
func (d *dbRepo) DbWClose() error {
|
||
sqlDB, err := d.DbW.DB()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return sqlDB.Close()
|
||
}
|
||
|
||
func dbConnect(user, pass, addr, dbName string) (*gorm.DB, error) {
|
||
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s&sql_mode=TRADITIONAL",
|
||
user,
|
||
pass,
|
||
addr,
|
||
dbName,
|
||
true,
|
||
"Local")
|
||
|
||
newLogger := logger.New(
|
||
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
|
||
logger.Config{
|
||
SlowThreshold: time.Second, // Slow SQL threshold
|
||
LogLevel: logger.Warn, // Log level
|
||
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
|
||
ParameterizedQueries: true, // Don't include params in the SQL log
|
||
Colorful: false, // Disable color
|
||
},
|
||
)
|
||
|
||
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
|
||
NamingStrategy: schema.NamingStrategy{
|
||
SingularTable: true,
|
||
},
|
||
Logger: newLogger, // 日志配置
|
||
})
|
||
|
||
if err != nil {
|
||
return nil, errors.Wrap(err, fmt.Sprintf("[db connection failed] Database name: %s", dbName))
|
||
}
|
||
|
||
db.Set("gorm:table_options", "CHARSET=utf8mb4")
|
||
|
||
sqlDB, err := db.DB()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 设置连接池 用于设置最大打开的连接数,默认值为0表示不限制.设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。
|
||
sqlDB.SetMaxOpenConns(100)
|
||
|
||
// 设置最大连接数 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
|
||
sqlDB.SetMaxIdleConns(5)
|
||
|
||
// 设置最大连接超时
|
||
sqlDB.SetConnMaxLifetime(time.Minute * 2)
|
||
|
||
// 使用插件
|
||
err = db.Use(&TracePlugin{})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return db, nil
|
||
}
|