GO语言操作MySQL

Posted 张志翔ۤ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数据库介绍完成。

以上是关于GO语言操作MySQL的主要内容,如果未能解决你的问题,请参考以下文章

Go语言开发(十八)Go语言MySQL数据库操作

Go语言操作MySQL

Go语言操作MySQL

Go语言中操作MySQL

Go语言操作Mysql语言基础知识

Go语言增强版操作Mysql(Sqlx)