golang myslq 连接池的思路学习练习【思路篇】
main.go
package main
import (
"fmt"
"viper_demo/dabasepool"
)
//写一个查询函数,使用数据库的函数
func Searchtest() {
var Id int64
var Title string
var Status int64
// 获取数据库handler
//db := dabasepool.EnvdbMap["001"] // 初始化已经初始化过,所以直接获取连接池中的db 这个直接也封装一个方法Gethandler
db := dabasepool.Gethandler("001")
// 执行查询过程
rows,err := db.Query("select * from todos") // todos 是本地的一个数据表
if err != nil {
fmt.Printf("查询失败")
} else {
for rows.Next(){
err := rows.Scan(&Id,&Title,&Status)
if err != nil {
fmt.Printf(" rows.Scan err:",err)
}
// 打印查询结果
fmt.Print("\n",Id,"---",Title,"---",Status)
}
}
}
func main() {
// 模拟数据库读取配置初始化的过程 创建数据库连接池
dbcnn := &dabasepool.DbConnector{
ID: "001",
Name: "bubble",
Host: "127.0.0.1",
User: "root",
Password: "123456",
Port: "3306",
Charset: "utf8",
Driver: "mysql",
}
dabasepool.Init(dbcnn)
// 调用查询过程
Searchtest()
}
/*
$ ./viper_demo.exe
2021/03/09 16:02:35 connStr:"root:123456@tcp(127.0.0.1)/bubble?charset=utf8&parseTime=True&loc=Local"
数据库连接成功
1018---newname---0
1019---dsf---0
1022---qeqewqewqewqqwe---0
1024---qqqqqqqqqqqqqqq---0
1031---qqqqqqqqqqqqqqq---0
1032---dfdfsdfsdfasfsafd---0
1033---11111111111---0
1034---11111111111---0
1035---11111111111---0
1036---11111111111---0
1037---11111111111---0
*/
dbpool.go
package dabasepool
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
var EnvdbMap map[string]*sql.DB
type DbConnector struct {
ID string // name
Name string
Host string
User string
Password string
Port string
Charset string
Driver string
Timeout int
MaxIdleConn int
MaxOpenConn int
MaxLifetime time.Duration
}
func Init(connector *DbConnector) *sql.DB {
if EnvdbMap == nil {
EnvdbMap = make(map[string]*sql.DB)
}
db, ok := EnvdbMap[connector.ID] // ID 就是键,handler 自己随便储存哪个都可以
if ok {
return db
} else {
connStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True&loc=Local", connector.User, connector.Password, connector.Host, connector.Name, connector.Charset)
log.Printf("connStr:%#v\n",connStr)
db, err := sql.Open("mysql", connStr)
if err != nil {
fmt.Printf("db conect failed")
} else {
fmt.Printf("数据库连接成功")
EnvdbMap[connector.ID] = db
}
return db
}
}
// 封装一个通过名字获取数据库hander的方法 用户查询的函数当中。
func Gethandler(name string) *sql.DB {
res := EnvdbMap[name]
return res
}
查询本地数据库的信息测试结果如下。
$ ./viper_demo.exe 2021/03/09 16:02:35 connStr:"root:123456@tcp(127.0.0.1)/bubble?charset=utf8&parseTime=True&loc=Local" 数据库连接成功 1018---newname---0 1019---dsf---0 1022---qeqewqewqewqqwe---0 1024---qqqqqqqqqqqqqqq---0 1031---qqqqqqqqqqqqqqq---0 1032---dfdfsdfsdfasfsafd---0 1033---11111111111---0 1034---11111111111---0 1035---11111111111---0 1036---11111111111---0 1037---11111111111---0
升级思路:
这里直接初始化了一个变量,硬编码配置信息过去, 可以直接用 viper 通过读取config.yaml 文件 进行初始化数据库配置
浙公网安备 33010602011771号