github.com/zhongdalu/gf@v1.0.0/g/database/gdb/gdb_config.go (about) 1 // Copyright 2017 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/zhongdalu/gf. 6 7 package gdb 8 9 import ( 10 "fmt" 11 "sync" 12 13 "github.com/zhongdalu/gf/g/container/gring" 14 ) 15 16 const ( 17 DEFAULT_GROUP_NAME = "default" // 默认配置名称 18 ) 19 20 // 数据库分组配置 21 type Config map[string]ConfigGroup 22 23 // 数据库集群配置 24 type ConfigGroup []ConfigNode 25 26 // 数据库单项配置 27 type ConfigNode struct { 28 Host string // 地址 29 Port string // 端口 30 User string // 账号 31 Pass string // 密码 32 Name string // 数据库名称 33 Type string // 数据库类型:mysql, sqlite, mssql, pgsql, oracle 34 Role string // (可选,默认为master)数据库的角色,用于主从操作分离,至少需要有一个master,参数值:master, slave 35 Debug bool // (可选)开启调试模式 36 Weight int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义 37 Charset string // (可选,默认为 utf8)编码,默认为 utf8 38 LinkInfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能) 39 MaxIdleConnCount int // (可选)连接池最大限制的连接数 40 MaxOpenConnCount int // (可选)连接池最大打开的连接数 41 MaxConnLifetime int // (可选,单位秒)连接对象可重复使用的时间长度 42 } 43 44 // 数据库配置包内对象 45 var configs struct { 46 sync.RWMutex // 并发安全互斥锁 47 config Config // 数据库分组配置 48 defaultGroup string // 默认数据库分组名称 49 } 50 51 // 包初始化 52 func init() { 53 configs.config = make(Config) 54 configs.defaultGroup = DEFAULT_GROUP_NAME 55 } 56 57 // 设置当前应用的数据库配置信息,进行全局数据库配置覆盖操作 58 func SetConfig(config Config) { 59 defer instances.Clear() 60 configs.Lock() 61 defer configs.Unlock() 62 configs.config = config 63 } 64 65 // 添加数据库服务器集群配置 66 func AddConfigGroup(group string, nodes ConfigGroup) { 67 defer instances.Clear() 68 configs.Lock() 69 defer configs.Unlock() 70 configs.config[group] = nodes 71 } 72 73 // 添加一台数据库服务器配置 74 func AddConfigNode(group string, node ConfigNode) { 75 defer instances.Clear() 76 configs.Lock() 77 defer configs.Unlock() 78 configs.config[group] = append(configs.config[group], node) 79 } 80 81 // 添加默认链接的一台数据库服务器配置 82 func AddDefaultConfigNode(node ConfigNode) { 83 AddConfigNode(DEFAULT_GROUP_NAME, node) 84 } 85 86 // 添加默认链接的数据库服务器集群配置 87 func AddDefaultConfigGroup(nodes ConfigGroup) { 88 AddConfigGroup(DEFAULT_GROUP_NAME, nodes) 89 } 90 91 // 添加一台数据库服务器配置 92 func GetConfig(group string) ConfigGroup { 93 configs.RLock() 94 defer configs.RUnlock() 95 return configs.config[group] 96 } 97 98 // 设置默认链接的数据库链接配置项(默认是 default) 99 func SetDefaultGroup(name string) { 100 defer instances.Clear() 101 configs.Lock() 102 defer configs.Unlock() 103 configs.defaultGroup = name 104 } 105 106 // 获取默认链接的数据库链接配置项(默认是 default) 107 func GetDefaultGroup() string { 108 defer instances.Clear() 109 configs.RLock() 110 defer configs.RUnlock() 111 return configs.defaultGroup 112 } 113 114 // 设置数据库连接池中空闲链接的大小 115 func (bs *dbBase) SetMaxIdleConnCount(n int) { 116 bs.maxIdleConnCount.Set(n) 117 } 118 119 // 设置数据库连接池最大打开的链接数量 120 func (bs *dbBase) SetMaxOpenConnCount(n int) { 121 bs.maxOpenConnCount.Set(n) 122 } 123 124 // 设置数据库连接可重复利用的时间,超过该时间则被关闭废弃 125 // 如果 d <= 0 表示该链接会一直重复利用 126 func (bs *dbBase) SetMaxConnLifetime(n int) { 127 bs.maxConnLifetime.Set(n) 128 } 129 130 // 节点配置转换为字符串 131 func (node *ConfigNode) String() string { 132 if node.LinkInfo != "" { 133 return node.LinkInfo 134 } 135 return fmt.Sprintf(`%s@%s:%s,%s,%s,%s,%s,%v,%d-%d-%d`, node.User, node.Host, node.Port, 136 node.Name, node.Type, node.Role, node.Charset, node.Debug, 137 node.MaxIdleConnCount, node.MaxOpenConnCount, node.MaxConnLifetime, 138 ) 139 } 140 141 // 是否开启调试服务 142 func (bs *dbBase) SetDebug(debug bool) { 143 if bs.debug.Val() == debug { 144 return 145 } 146 bs.debug.Set(debug) 147 if debug && bs.sqls == nil { 148 bs.sqls = gring.New(gDEFAULT_DEBUG_SQL_LENGTH) 149 } 150 } 151 152 // 获取是否开启调试服务 153 func (bs *dbBase) getDebug() bool { 154 return bs.debug.Val() 155 }