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(" ",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 ",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 文件 进行初始化数据库配置