golang中连接mysql数据库
golang中连接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,使得闲置连接保持住。
<
先要拉取⼀下github包,go get github/go-sql-driver/mysql
package main
import (
"database/sql"
"fmt"
"time"
_ "github/go-sql-driver/mysql"
)
func main() {
db, _ := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/gocron")
mysql默认端口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
以上就是golang中连接mysql数据库的详细内容,更多关于golang 连接mysql数据库的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论