GO语言操作MySQL

         最近工作中有使用到通过Go语言操作MySQL的相关内容,特此记录便于日后查阅。

        1、定义数据库结构体 

type DBConfig struct {
	Dsn     string `json:"dsn"`
	MaxIdle int    `json:"maxIdle"`
}

        2、数据库工具 

package db

import (
	"context"
	"database/sql"
	"sync"
	"time"
	_ "github.com/go-sql-driver/mysql"
	log "github.com/sirupsen/logrus"
)

var (
	dbLock    sync.RWMutex
	dbConnMap map[string]*sql.DB
)

var DB *sql.DB

func InitDB(dbConfig *g.DBConfig) {
	var err error
	DB, err = makeDbConn(dbConfig)
	if DB == nil || err != nil {
		log.Fatalln("g.InitDB, get db conn fail", err)
	}

	dbConnMap = make(map[string]*sql.DB)
	log.Println("g.InitDB ok")
}

func GetDbConn(connName string, dbConfig *g.DBConfig) (c *sql.DB, e error) {
	dbLock.Lock()
	defer dbLock.Unlock()

	var err error
	var dbConn *sql.DB
	dbConn = dbConnMap[connName]
	if dbConn == nil {
		dbConn, err = makeDbConn(dbConfig)
		if dbConn == nil || err != nil {
			closeDbConn(dbConn)
			return nil, err
		}
		dbConnMap[connName] = dbConn
	}

	err = dbConn.Ping()
	if err != nil {
		closeDbConn(dbConn)
		delete(dbConnMap, connName)
		return nil, err
	}

	return dbConn, err
}

// 创建一个新的mysql连接
func makeDbConn(dbConfig *g.DBConfig) (conn *sql.DB, err error) {
	conn, err = sql.Open("mysql", dbConfig.Dsn)
	if err != nil {
		return nil, err
	}

	conn.SetMaxIdleConns(dbConfig.MaxIdle)
	sqlCtx, _ := context.WithTimeout(context.Background(), time.Duration(time.Second*10))
	err = conn.PingContext(sqlCtx)

	return conn, err
}

func closeDbConn(conn *sql.DB) {
	if conn != nil {
		conn.Close()
	}
}

        注意:这里我们通过 dbConnMap map[string]*sql.DB 来管理创建的数据库连接,我们的 key 是执行的SQL语句名称,value就是这条SQL对应的数据库连接,这样我们就不用频繁创建和销毁数据库连接池了,极大地提升了CPU性能。

        到此 GO语言连接MySQL数据库介绍完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BasicLab基础架构实验室

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值