1 Star 0 Fork 0

fkil555 / gin-extend

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
db_group.go 2.73 KB
一键复制 编辑 原始数据 按行查看 历史
fkil555 提交于 2023-09-10 21:31 . gin-extend init
package gmysql
import (
"context"
"sync/atomic"
)
// Mysql主从组
type DBGroup struct {
mCounter uint64
Master []*DBConn
sCounter uint64
Slave []*DBConn
orm *DBOrm
}
func newDBGroup(groupConf *DBGroupConf) (dbGroup *DBGroup, err error) {
masterConf := groupConf.Master
slaveConf := groupConf.Slaves
dbGroup = &DBGroup{
Master: make([]*DBConn, 0),
Slave: make([]*DBConn, 0),
}
dbGroup.orm, _ = newDBOrm(dbGroup)
var dbConn *DBConn
// master连接池
if masterConf != nil && masterConf.Instances != nil {
for i := 0; i < len(masterConf.Instances); i++ {
if dbConn, err = newDBConnection(groupConf, masterConf, &masterConf.Instances[i]); err != nil {
return
}
dbGroup.Master = append(dbGroup.Master, dbConn)
}
}
// slave连接池
if slaveConf != nil && slaveConf.Instances != nil {
for i := 0; i < len(slaveConf.Instances); i++ {
if dbConn, err = newDBConnection(groupConf, slaveConf, &slaveConf.Instances[i]); err != nil {
return
}
dbGroup.Slave = append(dbGroup.Slave, dbConn)
}
}
return
}
// 选择连接
func (dbGroup *DBGroup) chooseConn(forceMaster bool) (conn *DBConn) {
if !forceMaster && len(dbGroup.Slave) != 0 { // 选择slave
counter := atomic.AddUint64(&dbGroup.sCounter, 1)
return dbGroup.Slave[counter%uint64(len(dbGroup.Slave))]
} else if len(dbGroup.Master) != 0 { // 选择master
counter := atomic.AddUint64(&dbGroup.mCounter, 1)
return dbGroup.Master[counter%uint64(len(dbGroup.Master))]
}
return
}
// SQL查询
func (dbGroup *DBGroup) Query(context context.Context, result interface{}, sql string, values ...interface{}) (err error) {
dbConn := dbGroup.chooseConn(false)
if dbConn == nil {
err = ERR_DB_CONN_NOT_FOUND
return
}
err = dbConn.Query(context, result, sql, values...)
return
}
func (dbGroup *DBGroup) QueryWithOptions(context context.Context, dbOptions *DBOptions, result interface{}, sql string, values ...interface{}) (err error) {
if dbOptions == nil {
dbOptions = DEFAULT_DBOPTION
}
dbConn := dbGroup.chooseConn(dbOptions.ForceMaster)
if dbConn == nil {
err = ERR_DB_CONN_NOT_FOUND
return
}
err = dbConn.Query(context, result, sql, values...)
return
}
func (DBGroup *DBGroup) ORM() *DBOrm {
return DBGroup.orm
}
// SQL写入
func (dbGroup *DBGroup) Exec(context context.Context, sql string, values ...interface{}) (result int64, err error) {
dbConn := dbGroup.chooseConn(true)
if dbConn == nil {
err = ERR_DB_CONN_NOT_FOUND
return
}
result, err = dbConn.Exec(context, sql, values...)
return
}
// 开启事务
func (dbGroup *DBGroup) Begin(context context.Context) (tx *DBConn, err error) {
dbConn := dbGroup.chooseConn(true)
if dbConn == nil {
err = ERR_DB_CONN_NOT_FOUND
return
}
tx, err = dbConn.Begin(context)
return
}
Go
1
https://gitee.com/fkil555/gin-extend.git
git@gitee.com:fkil555/gin-extend.git
fkil555
gin-extend
gin-extend
v0.0.13

搜索帮助