[Go] golang实现mysql链接池

golang中链接mysql数据库,须要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的链接池,而且只须要设置两个参数就能够实现mysql

通常链接mysql首先须要调用sql.Open函数,可是此时并无真正的去链接mysql,而是只建立了一个Db的对象而已。当执行Query或者是Exec方法时,才会去真正的链接数据库。git

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

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

SetMaxOpenConns(10)是设置的最大链接数,也就是甭管你多少并发,只能最多建立10条tcp链接,还有要注意的一点是,当执行完sql,链接转移到rows对象上,若是rows不关闭,这条链接不会被放回池里,其余并发获取不到链接会被阻塞住。
SetMaxIdleConns(5)是设置的执行完闲置的链接,这些就算是执行结束了sql语句仍是会保留着的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"
    "fmt"
    "time"

    _ "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;donetcp

开一个窗口tcpdump看闲置链接的请求状况,每隔15秒请求一次数据
tcpdump -i lo port 3306 -vv函数

相关文章
相关标签/搜索