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  }