2019-02-02 16:18:25 +08:00
|
|
|
|
// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
|
2017-12-29 16:03:30 +08:00
|
|
|
|
//
|
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
2019-02-02 16:18:25 +08:00
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2017-12-31 18:19:58 +08:00
|
|
|
|
|
2017-12-14 17:32:51 +08:00
|
|
|
|
package gdb
|
|
|
|
|
|
|
|
|
|
import (
|
2019-06-19 09:06:52 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"sync"
|
2019-09-24 23:41:18 +08:00
|
|
|
|
"time"
|
2019-06-29 10:45:50 +08:00
|
|
|
|
|
2019-08-26 19:39:04 +08:00
|
|
|
|
"github.com/gogf/gf/os/glog"
|
|
|
|
|
|
2019-07-29 21:01:19 +08:00
|
|
|
|
"github.com/gogf/gf/container/gring"
|
2017-12-14 17:32:51 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
2019-06-19 09:06:52 +08:00
|
|
|
|
DEFAULT_GROUP_NAME = "default" // 默认配置名称
|
2017-12-14 17:32:51 +08:00
|
|
|
|
)
|
|
|
|
|
|
2019-04-02 14:37:46 +08:00
|
|
|
|
// 数据库分组配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
type Config map[string]ConfigGroup
|
2017-12-14 17:32:51 +08:00
|
|
|
|
|
|
|
|
|
// 数据库集群配置
|
|
|
|
|
type ConfigGroup []ConfigNode
|
|
|
|
|
|
|
|
|
|
// 数据库单项配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
type ConfigNode struct {
|
2019-09-24 23:41:18 +08:00
|
|
|
|
Host string // 地址
|
|
|
|
|
Port string // 端口
|
|
|
|
|
User string // 账号
|
|
|
|
|
Pass string // 密码
|
|
|
|
|
Name string // 数据库名称
|
|
|
|
|
Type string // 数据库类型:mysql, sqlite, mssql, pgsql, oracle
|
|
|
|
|
Role string // (可选,默认为master)数据库的角色,用于主从操作分离,至少需要有一个master,参数值:master, slave
|
|
|
|
|
Debug bool // (可选)开启调试模式
|
|
|
|
|
Weight int // (可选)用于负载均衡的权重计算,当集群中只有一个节点时,权重没有任何意义
|
|
|
|
|
Charset string // (可选,默认为 utf8)编码,默认为 utf8
|
|
|
|
|
LinkInfo string // (可选)自定义链接信息,当该字段被设置值时,以上链接字段(Host,Port,User,Pass,Name)将失效(该字段是一个扩展功能)
|
|
|
|
|
MaxIdleConnCount int // (可选)连接池最大限制的连接数
|
|
|
|
|
MaxOpenConnCount int // (可选)连接池最大打开的连接数
|
|
|
|
|
MaxConnLifetime time.Duration // (可选)连接对象可重复使用的时间长度
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-04-02 14:37:46 +08:00
|
|
|
|
// 数据库配置包内对象
|
|
|
|
|
var configs struct {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
sync.RWMutex // 并发安全互斥锁
|
|
|
|
|
config Config // 数据库分组配置
|
|
|
|
|
defaultGroup string // 默认数据库分组名称
|
2019-04-02 14:37:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-14 17:32:51 +08:00
|
|
|
|
// 包初始化
|
|
|
|
|
func init() {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
configs.config = make(Config)
|
|
|
|
|
configs.defaultGroup = DEFAULT_GROUP_NAME
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置当前应用的数据库配置信息,进行全局数据库配置覆盖操作
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func SetConfig(config Config) {
|
|
|
|
|
defer instances.Clear()
|
|
|
|
|
configs.Lock()
|
|
|
|
|
defer configs.Unlock()
|
|
|
|
|
configs.config = config
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-02 20:35:29 +08:00
|
|
|
|
// 按照配置分组设置数据库服务器集群配置
|
|
|
|
|
func SetConfigGroup(group string, nodes ConfigGroup) {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
defer instances.Clear()
|
|
|
|
|
configs.Lock()
|
|
|
|
|
defer configs.Unlock()
|
|
|
|
|
configs.config[group] = nodes
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-02 20:35:29 +08:00
|
|
|
|
// 按照配置分组添加一台数据库服务器配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func AddConfigNode(group string, node ConfigNode) {
|
|
|
|
|
defer instances.Clear()
|
|
|
|
|
configs.Lock()
|
|
|
|
|
defer configs.Unlock()
|
|
|
|
|
configs.config[group] = append(configs.config[group], node)
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加默认链接的一台数据库服务器配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func AddDefaultConfigNode(node ConfigNode) {
|
|
|
|
|
AddConfigNode(DEFAULT_GROUP_NAME, node)
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加默认链接的数据库服务器集群配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func AddDefaultConfigGroup(nodes ConfigGroup) {
|
2019-09-02 20:35:29 +08:00
|
|
|
|
SetConfigGroup(DEFAULT_GROUP_NAME, nodes)
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-12-19 18:35:44 +08:00
|
|
|
|
// 添加一台数据库服务器配置
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func GetConfig(group string) ConfigGroup {
|
|
|
|
|
configs.RLock()
|
|
|
|
|
defer configs.RUnlock()
|
|
|
|
|
return configs.config[group]
|
2018-12-19 18:35:44 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-14 17:32:51 +08:00
|
|
|
|
// 设置默认链接的数据库链接配置项(默认是 default)
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func SetDefaultGroup(name string) {
|
|
|
|
|
defer instances.Clear()
|
|
|
|
|
configs.Lock()
|
|
|
|
|
defer configs.Unlock()
|
|
|
|
|
configs.defaultGroup = name
|
2019-04-02 14:37:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取默认链接的数据库链接配置项(默认是 default)
|
|
|
|
|
func GetDefaultGroup() string {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
defer instances.Clear()
|
2019-06-29 10:45:50 +08:00
|
|
|
|
configs.RLock()
|
|
|
|
|
defer configs.RUnlock()
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return configs.defaultGroup
|
2017-12-14 17:32:51 +08:00
|
|
|
|
}
|
2018-10-13 20:29:27 +08:00
|
|
|
|
|
2019-08-26 19:39:04 +08:00
|
|
|
|
// 设置数据库的日志管理对象
|
|
|
|
|
func (bs *dbBase) SetLogger(logger *glog.Logger) {
|
|
|
|
|
bs.logger = logger
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-13 20:29:27 +08:00
|
|
|
|
// 设置数据库连接池中空闲链接的大小
|
2019-06-29 10:45:50 +08:00
|
|
|
|
func (bs *dbBase) SetMaxIdleConnCount(n int) {
|
2019-08-26 19:39:04 +08:00
|
|
|
|
bs.maxIdleConnCount = n
|
2018-10-13 20:29:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置数据库连接池最大打开的链接数量
|
2019-06-29 10:45:50 +08:00
|
|
|
|
func (bs *dbBase) SetMaxOpenConnCount(n int) {
|
2019-08-26 19:39:04 +08:00
|
|
|
|
bs.maxOpenConnCount = n
|
2018-10-13 20:29:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置数据库连接可重复利用的时间,超过该时间则被关闭废弃
|
|
|
|
|
// 如果 d <= 0 表示该链接会一直重复利用
|
2019-09-24 23:41:18 +08:00
|
|
|
|
func (bs *dbBase) SetMaxConnLifetime(d time.Duration) {
|
|
|
|
|
bs.maxConnLifetime = d
|
2018-12-12 20:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 节点配置转换为字符串
|
|
|
|
|
func (node *ConfigNode) String() string {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if node.LinkInfo != "" {
|
|
|
|
|
return node.LinkInfo
|
|
|
|
|
}
|
2019-11-28 23:19:37 +08:00
|
|
|
|
return fmt.Sprintf(
|
|
|
|
|
`%s@%s:%s,%s,%s,%s,%s,%v,%d-%d-%d`,
|
|
|
|
|
node.User, node.Host, node.Port,
|
2019-07-06 16:51:50 +08:00
|
|
|
|
node.Name, node.Type, node.Role, node.Charset, node.Debug,
|
2019-06-19 09:06:52 +08:00
|
|
|
|
node.MaxIdleConnCount, node.MaxOpenConnCount, node.MaxConnLifetime,
|
|
|
|
|
)
|
2018-12-14 18:35:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 是否开启调试服务
|
2018-12-15 15:50:39 +08:00
|
|
|
|
func (bs *dbBase) SetDebug(debug bool) {
|
2019-07-15 17:40:21 +08:00
|
|
|
|
if bs.debug.Val() == debug {
|
|
|
|
|
return
|
|
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
|
bs.debug.Set(debug)
|
|
|
|
|
if debug && bs.sqls == nil {
|
2019-07-23 23:20:27 +08:00
|
|
|
|
bs.sqls = gring.New(gDEFAULT_DEBUG_SQL_LENGTH, true)
|
2019-06-19 09:06:52 +08:00
|
|
|
|
}
|
2018-12-14 18:35:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取是否开启调试服务
|
2018-12-15 15:50:39 +08:00
|
|
|
|
func (bs *dbBase) getDebug() bool {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return bs.debug.Val()
|
|
|
|
|
}
|