[Go] golang实现mysql连接池

golang中连接MysqL数据库,需要使用一个第三方类库github.com/go-sql-driver/MysqL在这个类库中就实现了MysqL的连接池,并且只需要设置两个参数就可以实现

一般连接MysqL首先需要调用sql.Open函数,但是此时并没有真正的去连接MysqL,而是只创建了一个Db的对象而已。当执行Query或者是Exec方法时,才会去真正的连接数据库

认情况下。每次执行sql语句,都会创建一条tcp连接,执行结束就会断掉连接,但是会保留两条连接闲置。当下次再执行 sql时,先用闲置的连接,不够的时候再去创建连接。

当设置了Db类下的这两个参数,就可以真正的实现连接池了。
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)

SetMaxOpenConns(10)是设置的最大连接数,也就是甭管你多少并发,只能最多创建10条tcp连接,还有要注意的一点是,当执行完sql,连接转移到rows对象上,如果rows不关闭,这条连接不会被放回池里,其他并发获取不到连接会被阻塞住。
SetMaxIdleConns(5)是设置的执行完闲置的连接,这些就算是执行结束了sql语句还是会保留着的

测试的流程是这样的,首先在代码中并发100次执行sql,开一个窗口不停的netstat查看3306端口看tcp连接的情况,可以看到最大就10条tcp连接,执行完后会有5条连接保持住,开一个窗口看tcpdump中3306端口的数据请求情况,在闲置连接的时候,会每10秒传递数据给MysqL,使得闲置连接保持住。

MysqLClient.go
先要拉取一下github包,go get github.com/go-sql-driver/MysqL

package main

import (
    "database/sql"
    fmttime"

    _ github.com/go-sql-driver/MysqL
)

func main() {
    db,_ := sql.Open(MysqL",root:123456@tcp(127.0.0.1:3306)/gocron)
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(5)
    //连接数据库查询
    for i := 0; i < 100; i++ {
        go func(i int) {
            msql := select * from user
            rows,_ := db.Query(msql)
            rows.Close() 这里如果不释放连接到池里,执行5次后其他并发就会阻塞
            fmt.Println(,i)
        }(i)

    }

    for {
        time.Sleep(time.Second)
    }
}

一个窗口不停的netstat
while true;do clear;date;netstat -altupn|grep 3306|grep Client;sleep 1;done

一个窗口tcpdump看闲置连接的请求情况,每隔15秒请求一次数
tcpdump -i lo port 3306 -vv

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1&#160;Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...