golang mysql 连接池 思路学习

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

原文地址:https://www.cnblogs.com/zexin88/p/14506211.html