封装数据库连接池--gorm


一、前提

1、目前,gorm的官网(https://jasperxu.github.io/gorm-zh/database.html#dbc)支持的数据库分别是mysql,postgresql等(其它数据库暂时不做出封装)。

2、在实际运用场所中,数据库的使用有时需要变动,这是为了代码更好的迁移,我们采用config.json配置文件形式存储数据库连接的信息。

二、封装连接

1、配置文件内容

{"database": {
"name" : "数据库名称",
"password" : "数据库密码",
"user" : "数据库用户",
"type" : "使用的数据库类型",
"host" : "数据库的host",
"port" : "端口",
"table_prefix" : "blog_"
}} //配置文件内容

2、配置文件对应的结构体定义以及初始化配置文件

type Config struct {
Database *Database `json:"database"`
}
var GlobalConfigSetting = &Config{}
func Setup() {
filePtr, err := os.Open("config/config.json") //config的文件目录
if err != nil {
fmt.Println("Open file failed [Err:%s]", err.Error())
return
}
defer filePtr.Close()
// 创建json解码器
decoder := json.NewDecoder(filePtr)
err = decoder.Decode(GlobalConfigSetting)
DatabaseSetting = GlobalConfigSetting.Database
}
type Database struct {
Type string `json:"type"`
User string `json:"user"`
Password string `json:"password"`
Host string `json:"host"`
Port string `json:"port"`
Name string `json:"name"`
TablePrefix string `json:"table_prefix"`
}
var DatabaseSetting = &Database{}

3、建立连接

var db *gorm.DB
func NewConnection() *gorm.DB {
var dbUri string
if settings.DatabaseSetting.Type == "mysql" {
dbUri = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
settings.DatabaseSetting.User,
settings.DatabaseSetting.Password,
settings.DatabaseSetting.Host,
settings.DatabaseSetting.Port,
settings.DatabaseSetting.Name)
} else if settings.DatabaseSetting.Type == "postgres" {
dbUri = fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=disable password=%s",
settings.DatabaseSetting.Host,
settings.DatabaseSetting.Port,
settings.DatabaseSetting.User,
settings.DatabaseSetting.Name,
settings.DatabaseSetting.Password)
} else {
dbUri = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
settings.DatabaseSetting.User,
settings.DatabaseSetting.Password,
settings.DatabaseSetting.Host,
settings.DatabaseSetting.Port,
settings.DatabaseSetting.Name)
}

conn, err := gorm.Open(settings.DatabaseSetting.Type, dbUri)
if err != nil {
log.Print(err.Error())
}
return conn
}

4、数据库连接池的设置

func Setup() {
db = NewConnection()
db.DB().SetMaxIdleConns(10) //最大空闲连接数
db.DB().SetMaxOpenConns(30) //最大连接数
db.DB().SetConnMaxLifetime(time.Second * 300) //设置连接空闲超时
//db.LogMode(true)
}

5、提供公共方法获取db对象

func GetDB() *gorm.DB {
if err := db.DB().Ping(); err != nil {
db.Close()
db = NewConnection()
}
return db
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM