zoukankan      html  css  js  c++  java
  • 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 文件 进行初始化数据库配置 

  • 相关阅读:
    【转载】Java系列笔记(3)
    CentOS 7下Samba服务器的安装与配置
    Linux常用目录结构
    Linux计划任务crontab
    转:Linux 双网卡配置两个IP同时只有一个会通的原因
    centos7中搭建ntp服务器
    centos7中使用vg方式扩充root分区
    ping命令脚本实现显示网络状态、学生姓名、学号
    centos中基于随机数,再加入班级学生姓名
    centos7 shell脚本实现随机数
  • 原文地址:https://www.cnblogs.com/zexin88/p/14506211.html
Copyright © 2011-2022 走看看