/* ================================================================================= * License: GPL-2.0 license * Author: 众产® https://ciy.cn/code * Version: 0.1.0 ================================================================================= 多读库路由 NewCiyDBRoute ** 该路由库可能由HAProxy取代 ================================================================================= dbr, err = c.NewCiyDBRoute(dbn[]string, 最大连接数, 空闲连接数, 保活秒) //main初始化 dbr.Takeout() //取出一个负载较低的数据库连接池 ================================================================================= 示例: dbr, err = c.NewCiyDBRoute([]string{"user:pass@tcp(localhost:3306)/dbname"}) //main初始化一直开着,程序结束才关 db := dbr.Takeout() //取出一个数据库连接池 ================================================================================= */ package zciyon import ( "fmt" ) // 数据路由,包含多个数据库池路由,取出一个连接池用。 type CiyDBRoute struct { routes []*CiyMysql } // 多台读服务器dsn,要求内容一致的互为镜像 func NewCiyDBRoute(dsns []string, maxopenconn int, maxidelconn int, maxlifesec int) (*CiyDBRoute, error) { dbroute := &CiyDBRoute{} dbroute.routes = make([]*CiyMysql, 0) for idx, dsn := range dsns { dbr, err := NewCiyMysql(dsn, maxopenconn, maxidelconn, maxlifesec) if err != nil { return nil, fmt.Errorf("DB[%d]: %v", idx, err) } dbr.MonitorHealth(10) dbroute.routes = append(dbroute.routes, dbr) } if len(dbroute.routes) == 0 { return nil, fmt.Errorf("no dsn") } return dbroute, nil } // 取出一个相对健康的目标数据库连接池 func (thos *CiyDBRoute) Takeout() CiyMysql { minhealth := 100000 dbidx := 0 for idx, dbr := range thos.routes { if dbr.Health < minhealth { minhealth = dbr.Health dbidx = idx } } return *thos.routes[dbidx] }