go-gorm 之mysql数据库读写分离
·
gorm使用mysql读写分离,官网 https://gorm.io/zh_CN/docs/dbresolver.html 已经给出了demo以及使用方法,但是我这边一直无法分离,没排查出来原因。
我用的版本 gorm.io/gorm v1.23.3,无奈换了个思路,使用了两个mysql连接池,一个连主,一个连从,因为我也主要是想利用从分担一部分离线分析业务,所以对我来说足够了。欢迎有经验的小伙伴留言
具体代码如下:
//考虑不再使用jinzhu/gorm,更新太慢,使用社区原生版本
var _db *gorm.DB
var _dbSlave *gorm.DB
func GetDB() *gorm.DB{
return _db
}
func GetDB_Slave() *gorm.DB{
return _dbSlave
}
func MySqlConn(dbUser string, dbPassword string, dbHost string, dbPort string, dbName string,
timeout string, maxOpenConnection int, maxIdleConnection int, dbDebug bool) (bool,error){
var err error
var dialector gorm.Dialector
var conn *gorm.DB
dbUri := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Asia%%2fShanghai&timeout=%ss", dbUser, dbPassword, dbHost, dbPort, dbName,timeout)
dialector = mysql.New(mysql.Config{
DSN: dbUri, // data source name
DefaultStringSize: 256, // default size for string fields
DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
DontSupportRenameIndex: true, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
DontSupportRenameColumn: true, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
SkipInitializeWithVersion: false, // auto configure based on currently MySQL version
})
if dbDebug {
conn, err = gorm.Open(dialector, &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
Logger: logger.Default.LogMode(logger.Info),
})
}else {
conn, err = gorm.Open(dialector, &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
Logger: logger.Default.LogMode(logger.Error),
})
}
if err != nil {
panic(err.Error())
}
sqlDB, err := conn.DB()
if err != nil {
panic("connect db server failed.")
}
sqlDB.SetMaxIdleConns(maxIdleConnection) // SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxOpenConns(maxOpenConnection) // SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetConnMaxLifetime(time.Second * 30) // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
_db = conn
return true,nil
}
//使用主从读写分离
func MySqlConnSlave(dbDebug bool) (bool,error){
var err error
var dialector gorm.Dialector
var conn *gorm.DB
dbSlaveUri := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Asia%%2fShanghai&timeout=%ss", config.GetServerYml().MysqlSlave.Username, config.GetServerYml().MysqlSlave.Password,config.GetServerYml().MysqlSlave.Host, config.GetServerYml().MysqlSlave.Port, config.GetServerYml().MysqlSlave.Db,config.GetServerYml().MysqlSlave.Timeout)
dialector = mysql.New(mysql.Config{
DSN: dbSlaveUri, // data source name
DefaultStringSize: 256, // default size for string fields
DisableDatetimePrecision: true, // disable datetime precision, which not supported before MySQL 5.6
DontSupportRenameIndex: true, // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
DontSupportRenameColumn: true, // `change` when rename column, rename column not supported before MySQL 8, MariaDB
SkipInitializeWithVersion: false, // auto configure based on currently MySQL version
})
if dbDebug {
conn, err = gorm.Open(dialector, &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
Logger: logger.Default.LogMode(logger.Info),
})
}else {
conn, err = gorm.Open(dialector, &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
Logger: logger.Default.LogMode(logger.Error),
})
}
if err != nil {
panic(err.Error())
}
sqlDB, err := conn.DB()
if err != nil {
panic("connect db server failed.")
}
sqlDB.SetMaxIdleConns(config.GetServerYml().MysqlSlave.MaxIdleconnection) // SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxOpenConns(config.GetServerYml().MysqlSlave.MaxOpenconnection) // SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetConnMaxLifetime(time.Second * 30) // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
_dbSlave = conn
return true,nil
}
更多推荐
所有评论(0)