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 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) //連接資料庫查詢 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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59788.html
標籤:Go
下一篇:go-gtk環境配置
