go mysql 链接池


title : go mysql 链接池 category : go tag : go mysql

  • mysql自带链接池,使用步骤

首先开启web服务

	http.HandleFunc("/index", pool)
	if err := http.ListenAndServe(":9090", nil); err != nil {
		panic(err)
	}

db初始化全局对象

var db *sql.DB
func init() {
	//初始化数据库链接 建立连接池
	db, _ = sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/qipajun?charset=utf8")
	db.SetMaxOpenConns(2000)   //用于设置最大打开的连接数,默认值为0表示不限制。
	db.SetMaxIdleConns(1000)       //SetMaxIdleConns用于设置闲置的连接数。
	db.Ping()
}

完整代码

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "log"
    "net/http"
)

var db *sql.DB

func init() {
    db, _ = sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8")
    db.SetMaxOpenConns(2000)
    db.SetMaxIdleConns(1000)
    db.Ping()
}

func main() {
    startHttpServer()
}

func startHttpServer() {
    http.HandleFunc("/pool", pool)
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func pool(w http.ResponseWriter, r *http.Request) {
    rows, err := db.Query("SELECT * FROM user limit 1")
    defer rows.Close()
    checkErr(err)

    columns, _ := rows.Columns()
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for j := range values {
        scanArgs[j] = &values[j]
    }

    record := make(map[string]string)
    for rows.Next() {
        //将行数据保存到record字典
        err = rows.Scan(scanArgs...)
        for i, col := range values {
            if col != nil {
                record[columns[i]] = string(col.([]byte))
            }
        }
    }

    fmt.Println(record)
    fmt.Fprintln(w, "finish")
}

func checkErr(err error) {
    if err != nil {
        fmt.Println(err)
        panic(err)
    }
}