golang中連接mysql數(shù)據(jù)庫(kù)
golang中連接mysql數(shù)據(jù)庫(kù),需要使用一個(gè)第三方類(lèi)庫(kù)github.com/go-sql-driver/mysql,在這個(gè)類(lèi)庫(kù)中就實(shí)現(xiàn)了mysql的連接池,并且只需要設(shè)置兩個(gè)參數(shù)就可以實(shí)現(xiàn)
一般連接mysql首先需要調(diào)用sql.Open函數(shù),但是此時(shí)并沒(méi)有真正的去連接mysql,而是只創(chuàng)建了一個(gè)Db的對(duì)象而已。當(dāng)執(zhí)行Query或者是Exec方法時(shí),才會(huì)去真正的連接數(shù)據(jù)庫(kù)。
默認(rèn)情況下。每次執(zhí)行sql語(yǔ)句,都會(huì)創(chuàng)建一條tcp連接,執(zhí)行結(jié)束就會(huì)斷掉連接,但是會(huì)保留兩條連接閑置。當(dāng)下次再執(zhí)行 sql時(shí),先用閑置的連接,不夠的時(shí)候再去創(chuàng)建連接。
當(dāng)設(shè)置了Db類(lèi)下的這兩個(gè)參數(shù),就可以真正的實(shí)現(xiàn)連接池了。
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
SetMaxOpenConns(10)是設(shè)置的最大連接數(shù),也就是甭管你多少并發(fā),只能最多創(chuàng)建10條tcp連接,還有要注意的一點(diǎn)是,當(dāng)執(zhí)行完sql,連接轉(zhuǎn)移到rows對(duì)象上,如果rows不關(guān)閉,這條連接不會(huì)被放回池里,其他并發(fā)獲取不到連接會(huì)被阻塞住。
SetMaxIdleConns(5)是設(shè)置的執(zhí)行完閑置的連接,這些就算是執(zhí)行結(jié)束了sql語(yǔ)句還是會(huì)保留著的
測(cè)試的流程是這樣的,首先在代碼中并發(fā)100次執(zhí)行sql,開(kāi)一個(gè)窗口不停的netstat查看3306端口看tcp連接的情況,可以看到最大就10條tcp連接,執(zhí)行完后會(huì)有5條連接保持住,開(kāi)一個(gè)窗口看tcpdump中3306端口的數(shù)據(jù)請(qǐng)求情況,在閑置連接的時(shí)候,會(huì)每10秒傳遞數(shù)據(jù)給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)
//連接數(shù)據(jù)庫(kù)查詢(xún)
for i := 0; i < 100; i++ {
go func(i int) {
mSql := "select * from user"
rows, _ := db.Query(mSql)
rows.Close() //這里如果不釋放連接到池里,執(zhí)行5次后其他并發(fā)就會(huì)阻塞
fmt.Println("第 ", i)
}(i)
}
for {
time.Sleep(time.Second)
}
}
開(kāi)一個(gè)窗口不停的netstat
while true;do clear;date;netstat -altupn|grep 3306|grep Client;sleep 1;done

開(kāi)一個(gè)窗口tcpdump看閑置連接的請(qǐng)求情況,每隔15秒請(qǐng)求一次數(shù)據(jù)
tcpdump -i lo port 3306 -vv

以上就是golang中連接mysql數(shù)據(jù)庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于golang 連接mysql數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go基于struct?tag實(shí)現(xiàn)結(jié)構(gòu)體字段級(jí)別的訪問(wèn)控制
本文將會(huì)基于這個(gè)主題展開(kāi),討論Go中的結(jié)構(gòu)體tag究竟是什么,我們?cè)撊绾卫盟?另外,文末還提供了一個(gè)實(shí)際案例,實(shí)現(xiàn)結(jié)構(gòu)體字段級(jí)別的訪問(wèn),幫助我們進(jìn)一步提升對(duì)struct tag的理解2024-02-02
Golang中context庫(kù)的高級(jí)應(yīng)用
context庫(kù)不僅對(duì)于提升代碼的效率和性能至關(guān)重要,而且還幫助開(kāi)發(fā)者在復(fù)雜的系統(tǒng)中保持代碼的清晰和可維護(hù)性,下面我們就來(lái)看看context庫(kù)的高級(jí)應(yīng)用吧2024-01-01
go語(yǔ)言?xún)?yōu)雅地處理error工具及技巧詳解
這篇文章主要為大家介紹了go語(yǔ)言?xún)?yōu)雅地處理error工具及技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Go語(yǔ)言中函數(shù)可變參數(shù)(Variadic Parameter)詳解
在Python中,在函數(shù)參數(shù)不確定數(shù)量的情況下,可以動(dòng)態(tài)在函數(shù)內(nèi)獲取參數(shù)。在Go語(yǔ)言中,也有類(lèi)似的實(shí)現(xiàn)方式,本文就來(lái)為大家詳細(xì)講解一下2022-07-07

