gdb增加MaxIdleConnCount/MaxOpenConnCount/MaxConnLifetime三项配置,并增加SetMaxConnLifetime方法

This commit is contained in:
john
2018-07-27 16:32:05 +08:00
parent a98a94bec6
commit aadbb774f8
4 changed files with 57 additions and 14 deletions

View File

@ -18,6 +18,7 @@ import (
"gitee.com/johng/gf/g/container/gring"
"gitee.com/johng/gf/g/os/gcache"
"gitee.com/johng/gf/g/container/gmap"
"time"
)
const (
@ -49,6 +50,7 @@ type Link interface {
// 连接属性设置
SetMaxIdleConns(n int)
SetMaxOpenConns(n int)
SetConnMaxLifetime(d time.Duration)
// 开启事务操作
Begin() (*Tx, error)
@ -229,6 +231,16 @@ func newDb (masterNode *ConfigNode, slaveNode *ConfigNode, groupName string) (*D
charr : link.getQuoteCharRight(),
debug : gtype.NewBool(),
}
// 设置连接属性master和slave必须是一致的所以这里使用的是master的属性设置
if masterNode.MaxIdleConnCount > 0 {
db.SetMaxIdleConns(masterNode.MaxIdleConnCount)
}
if masterNode.MaxOpenConnCount > 0 {
db.SetMaxOpenConns(masterNode.MaxOpenConnCount)
}
if masterNode.MaxConnLifetime > 0 {
db.SetConnMaxLifetime(time.Duration(masterNode.MaxConnLifetime)*time.Second)
}
if v := dbCaches.Get(groupName); v == nil {
dbCaches.LockFunc(func(m map[string]interface{}) {
if v, ok := m[groupName]; !ok {

View File

@ -17,6 +17,7 @@ import (
"gitee.com/johng/gf/g/util/gconv"
"gitee.com/johng/gf/g/container/gring"
"gitee.com/johng/gf/g/os/gtime"
"time"
)
const (
@ -237,24 +238,42 @@ func (db *Db) Prepare(query string) (*sql.Stmt, error) {
// ping一下判断或保持数据库链接(master)
func (db *Db) PingMaster() error {
err := db.master.Ping();
err := db.master.Ping()
return err
}
// ping一下判断或保持数据库链接(slave)
func (db *Db) PingSlave() error {
err := db.slave.Ping();
err := db.slave.Ping()
return err
}
// 设置数据库连接池中空闲链接的大小
func (db *Db) SetMaxIdleConns(n int) {
db.master.SetMaxIdleConns(n);
db.master.SetMaxIdleConns(n)
// 比较的是指向的变量地址
if db.master != db.slave {
db.slave.SetMaxIdleConns(n)
}
}
// 设置数据库连接池最大打开的链接数量
func (db *Db) SetMaxOpenConns(n int) {
db.master.SetMaxOpenConns(n);
db.master.SetMaxOpenConns(n)
// 比较的是指向的变量地址
if db.master != db.slave {
db.slave.SetMaxOpenConns(n)
}
}
// 设置数据库连接可重复利用的时间,超过该时间则被关闭废弃
// 如果 d <= 0 表示该链接会一直重复利用
func (db *Db) SetConnMaxLifetime(d time.Duration) {
db.master.SetConnMaxLifetime(d)
// 比较的是指向的变量地址
if db.master != db.slave {
db.slave.SetConnMaxLifetime(d)
}
}
// 事务操作,开启,会返回一个底层的事务操作对象链接如需要嵌套事务,那么可以使用该对象,否则请忽略

View File

@ -30,16 +30,19 @@ type ConfigGroup []ConfigNode
// 数据库单项配置
type ConfigNode struct {
Host string // 地址
Port string // 端口
User string // 账号
Pass string // 密码
Name string // 数据库名称
Type string // 数据库类型mysql, sqlite, mssql, pgsql, oracle(目前仅支持mysql)
Role string // (可选默认为master)数据库的角色用于主从操作分离至少需要有一个master参数值master, slave
Charset string // (可选,默认为 utf8)编码,默认为 utf8
Priority int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
Linkinfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能)
Host string // 地址
Port string // 端口
User string // 账号
Pass string // 密码
Name string // 数据库名称
Type string // 数据库类型mysql, sqlite, mssql, pgsql, oracle(目前仅支持mysql)
Role string // (可选默认为master)数据库的角色用于主从操作分离至少需要有一个master参数值master, slave
Charset string // (可选,默认为 utf8)编码,默认为 utf8
Priority int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
Linkinfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能)
MaxIdleConnCount int // (可选)连接池最大限制的连接数
MaxOpenConnCount int // (可选)连接池最大打开的连接数
MaxConnLifetime int // (可选,单位秒)连接对象可重复使用的时间长度
}
// 数据库集群配置示例,支持主从处理,多数据库集群支持

9
g/g.go
View File

@ -107,6 +107,15 @@ func Database(name...string) *gdb.Db {
if value, ok := nodem["priority"]; ok {
node.Priority = gconv.Int(value)
}
if value, ok := nodem["max-idle"]; ok {
node.MaxIdleConnCount = gconv.Int(value)
}
if value, ok := nodem["max-open"]; ok {
node.MaxOpenConnCount = gconv.Int(value)
}
if value, ok := nodem["max-lifetime"]; ok {
node.MaxConnLifetime = gconv.Int(value)
}
cg = append(cg, node)
}
}