From aadbb774f8cc4ec90aa986c915cc139e91e62847 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 27 Jul 2018 16:32:05 +0800 Subject: [PATCH] =?UTF-8?q?gdb=E5=A2=9E=E5=8A=A0MaxIdleConnCount/MaxOpenCo?= =?UTF-8?q?nnCount/MaxConnLifetime=E4=B8=89=E9=A1=B9=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=A2=9E=E5=8A=A0SetMaxConnLifetime=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/database/gdb/gdb.go | 12 ++++++++++++ g/database/gdb/gdb_base.go | 27 +++++++++++++++++++++++---- g/database/gdb/gdb_config.go | 23 +++++++++++++---------- g/g.go | 9 +++++++++ 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/g/database/gdb/gdb.go b/g/database/gdb/gdb.go index 9abcda604..8c44a28f9 100644 --- a/g/database/gdb/gdb.go +++ b/g/database/gdb/gdb.go @@ -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 { diff --git a/g/database/gdb/gdb_base.go b/g/database/gdb/gdb_base.go index d787e9693..260d784b7 100644 --- a/g/database/gdb/gdb_base.go +++ b/g/database/gdb/gdb_base.go @@ -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) + } } // 事务操作,开启,会返回一个底层的事务操作对象链接如需要嵌套事务,那么可以使用该对象,否则请忽略 diff --git a/g/database/gdb/gdb_config.go b/g/database/gdb/gdb_config.go index a19cb1a23..a753ed2d2 100644 --- a/g/database/gdb/gdb_config.go +++ b/g/database/gdb/gdb_config.go @@ -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 // (可选,单位秒)连接对象可重复使用的时间长度 } // 数据库集群配置示例,支持主从处理,多数据库集群支持 diff --git a/g/g.go b/g/g.go index aacde4597..fb3890a5a 100644 --- a/g/g.go +++ b/g/g.go @@ -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) } }