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
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐