1、数据库的注册,连接
func connectDbs() {
registerDefault := false
for dbName, config := range configs.GetGlobalConfig().DataBase {
connectString := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&loc=Local",
config.User, config.Password, config.Host, config.Port, config.Name, config.Charset)
if registerDefault == false {
orm.RegisterDataBase("default", "mysql", connectString, config.MaxIdleCons, config.MaxOpenCons)
registerDefault = true
}
xzap.Sugar(nil).Infof("db (%v) c is (%v)", dbName, connectString)
err := orm.RegisterDataBase(dbName, "mysql", connectString, config.MaxIdleCons, config.MaxOpenCons)
if err == nil {
ormDb, err := orm.GetDB(dbName)
if err != nil {
xzap.Sugar(nil).Errorf("orm GetDB (%v) error (%v)", dbName, err)
} else {
ormDb.SetConnMaxLifetime(time.Duration(config.MaxConsLifetime) * time.Second)
}
xzap.Sugar(nil).Infof("connect db (%v) success", dbName)
} else {
xzap.Sugar(nil).Errorf("connect db (%v) error (%v)", dbName, err)
}
o := orm.NewOrm()
o.Using(dbName)
// if configs.AppDebug() {
// orm.Debug = true
// }
client.Connects[dbName] = o
}
}
解析:
(1)orm必须注册一个default数据库
(2)将数据库的信息放在结构体数组里就可以循环的读取
(3)orm.GetDB()从已注册的数据库返回*sql.DB对象,默认返回别名为default的数据库。
(4)SetConnMaxLifetime(time.Duration
(config.MaxConsLifetime) * time.Second)
设置超时
(5)o = orm.NewOrm() // 创建一个 Ormer
(6)Using()切换为其它数据库
2、创建map[数据库名]ormer对象
func initDb() {
client = &mysqlClient{
Connects: make(map[string]orm.Ormer),
}
connectDbs()
success = true
}
3、根据数据库名获取ormer对象
func GetMysqlDb(dbName string) orm.Ormer {
if !success {
dbLocker.Lock()
if !success {
initDb()
}
dbLocker.Unlock()
}
return client.Connects[dbName]
}
解析:采用单例模式的方法,只初始化一次DB,加锁防止多线程。