1. 程式人生 > 資料庫 >golang中連線mysql資料庫

golang中連線mysql資料庫

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 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;done

golang中連線mysql資料庫

開一個視窗tcpdump看閒置連線的請求情況,每隔15秒請求一次資料

tcpdump -i lo port 3306 -vv

golang中連線mysql資料庫

以上就是golang中連線mysql資料庫的詳細內容,更多關於golang 連線mysql資料庫的資料請關注我們其它相關文章!