golang中連接mysql數(shù)據(jù)庫
golang中連接mysql數(shù)據(jù)庫,需要使用一個第三方類庫github.com/go-sql-driver/mysql,在這個類庫中就實(shí)現(xiàn)了mysql的連接池,并且只需要設(shè)置兩個參數(shù)就可以實(shí)現(xiàn)
一般連接mysql首先需要調(diào)用sql.Open函數(shù),但是此時并沒有真正的去連接mysql,而是只創(chuàng)建了一個Db的對象而已。當(dāng)執(zhí)行Query或者是Exec方法時,才會去真正的連接數(shù)據(jù)庫。
默認(rèn)情況下。每次執(zhí)行sql語句,都會創(chuàng)建一條tcp連接,執(zhí)行結(jié)束就會斷掉連接,但是會保留兩條連接閑置。當(dāng)下次再執(zhí)行 sql時,先用閑置的連接,不夠的時候再去創(chuàng)建連接。
當(dāng)設(shè)置了Db類下的這兩個參數(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對象上,如果rows不關(guān)閉,這條連接不會被放回池里,其他并發(fā)獲取不到連接會被阻塞住。SetMaxIdleConns(5)是設(shè)置的執(zhí)行完閑置的連接,這些就算是執(zhí)行結(jié)束了sql語句還是會保留著的
測試的流程是這樣的,首先在代碼中并發(fā)100次執(zhí)行sql,開一個窗口不停的netstat查看3306端口看tcp連接的情況,可以看到最大就10條tcp連接,執(zhí)行完后會有5條連接保持住,開一個窗口看tcpdump中3306端口的數(shù)據(jù)請求情況,在閑置連接的時候,會每10秒傳遞數(shù)據(jù)給mysql,使得閑置連接保持住。
mysqlClient.go
先要拉取一下github包,go get github.com/go-sql-driver/mysql
package mainimport ( '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ù)庫查詢 for i := 0; i < 100; i++ { go func(i int) { mSql := 'select * from user' rows, _ := db.Query(mSql) rows.Close() //這里如果不釋放連接到池里,執(zhí)行5次后其他并發(fā)就會阻塞 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秒請求一次數(shù)據(jù)
tcpdump -i lo port 3306 -vv
以上就是golang中連接mysql數(shù)據(jù)庫的詳細(xì)內(nèi)容,更多關(guān)于golang 連接mysql數(shù)據(jù)庫的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
