Bagaimana untuk menetapkan bilangan maksimum sambungan dan bilangan maksimum sambungan terbiar dalam golang digabungkan dengan mysql

王林
Lepaskan: 2023-06-03 14:15:53
ke hadapan
1398 orang telah melayarinya

Bilangan maksimum sambungan dan bilangan maksimum sambungan melahu ditakrifkan dalam pangkalan data/sql dalam pustaka standard golang.

Pakej pemacu SQL yang digunakan dalam contoh untuk menyambung ke MySQL ialah github.com/go-sql-driver/mysql.

Antara muka untuk menetapkan bilangan maksimum sambungan ialah

func (db *DB) SetMaxOpenConns(n int)
Salin selepas log masuk

Tetapkan sambungan Bilangan maksimum sambungan yang boleh dibuka oleh MySQL.

Jika n <= 0, ini bermakna tiada had pada bilangan sambungan terbuka.

Lalainya ialah 0, yang bermaksud tiada had pada bilangan sambungan.

Parameter lain yang berkaitan dengan bilangan sambungan ialah MaxIdleConns, yang mewakili bilangan maksimum sambungan melahu.

Jika MaxIdleConns lebih besar daripada 0 dan lebih besar daripada MaxOpenConns, maka MaxIdleConns akan dilaraskan untuk sama dengan MaxOpenConns dan lebihan sambungan akan ditutup apabila terdapat lebihan sambungan.

Antara muka untuk menetapkan bilangan maksimum sambungan melahu ialah:

func (db *DB) SetMaxIdleConns(n int)
Salin selepas log masuk

Apabila n<=0, kolam sambungan melahu tidak akan digunakan, iaitu apabila kolam sambungan melahu tidak digunakan, sambungan yang tidak digunakan tidak akan disimpan di dalamnya. Oleh itu, kaedah ini tidak menggunakan semula sambungan, dan sambungan baharu perlu diwujudkan semula setiap kali pernyataan SQL dilaksanakan. <=0时,空闲连接池不会被使用,即不使用空闲连接池时,未使用的连接将不会被存入其中。因此,这种方法不会重复利用连接,每次执行SQL语句都需要重新建立新的连接。

Bilangan maksimum lalai sambungan melahu ialah 2:
const defaultMaxIdleConns = 2

Mengenai hubungan antara sambungan terbuka dan sambungan melahu, sila tambah:

Sambungan terbuka = ​​sambungan sedang digunakan (tidak digunakan) + sambungan dalam keadaan melahu (melahu)

Ujian berikut dan sahkan bilangan maksimum sambungan dan bilangan maksimum sambungan terbiar.

1. Ujian bilangan maksimum sambungan

Mula-mula tetapkan bilangan maksimum sambungan terbuka kepada 1, kemudian buka 20 goroutine, setiap goroutine melaksanakan pernyataan sql dan mencetak id sambungan sambungan digunakan untuk melaksanakan sql . Perhatikan pelaksanaan Goroutine lain yang perlu melaksanakan SQL apabila melaksanakan penyataan SQL yang memakan masa yang menduduki sambungan.

Kod contoh adalah seperti berikut:

package main

import (
        "database/sql"
        "log"

        _ "github.com/go-sql-driver/mysql"
)

var DB *sql.DB
var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true"

func Init() {
        var err error
        DB, err = sql.Open("mysql", dataBase)
        if err != nil {
                log.Fatalln("open db fail:", err)
        }

        DB.SetMaxOpenConns(1)

        err = DB.Ping()
        if err != nil {
                log.Fatalln("ping db fail:", err)
        }
}

func main() {
        Init()
        
        //开启20个goroutine
        for i:=0; i < 20; i++ {
                go one_worker(i)
        }
        
        select {
        }

}

func one_worker(i int) {
        var connection_id int
        err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id)
        if err != nil {
                log.Println("query connection id failed:", err)
                return
        }

        log.Println("worker:", i, ", connection id:", connection_id)

        var result int
        err = DB.QueryRow("select sleep(10)").Scan(&result)
        if err != nil {
                log.Println("query sleep connection id faild:", err)
                return
        }

}
Salin selepas log masuk

output

2019/10/02 18:14:25 pekerja: 2 , id sambungan: 55
2019/ 10/02 18:14:25 pekerja: 17 , id sambungan: 55
2019/10/02 18:14:25 pekerja: 11 , id sambungan: 55
2019/10/02 18: 14:35 pekerja: 3 , id sambungan: 55
2019/10/02 18:14:45 pekerja: 0 , id sambungan: 55
2019/10/02 18:14:45 pekerja: 4 , sambungan id: 55
2019/10/02 18:14:45 pekerja: 5 , id sambungan: 55
2019/10/02 18:15:05 pekerja: 7 , id sambungan: 55
2019/ 10/02 18:15:25 pekerja: 15, id sambungan: 55
2019/10/02 18:15:25 pekerja: 6, id sambungan: 55
2019/10/02 18:15:35 pekerja: 13 , id sambungan: 55
2019/10/02 18:15:45 pekerja: 19 , id sambungan: 55
2019/10/02 18:15:45 pekerja: 10 , id sambungan: 55
2019/10/02 18:15:45 pekerja: 12 , id sambungan: 55
2019/10/02 18:15:55 pekerja: 14 , id sambungan: 55
2019/10/02 18:16:15 pekerja: 8 , id sambungan: 55
2019/10/02 18:16:35 pekerja: 18 , id sambungan: 55
2019/10/02 18:16:35 pekerja: 1 , id sambungan : 55
2019/10/02 18:17:05 pekerja: 16 , id sambungan: 55
2019/10/02 18:17:35 pekerja: 9 , id sambungan: 55

Gunakan senarai proses untuk melihat sambungan

mysql> show processlist;
+----+------+-----------------+------+---------+------+------------+------------------+
| Id | User | Host            | db   | Command | Time | State      | Info             |
+----+------+-----------------+------+---------+------+------------+------------------+
| 20 | root | localhost       | NULL | Query   |    0 | starting   | show processlist |
| 55 | root | localhost:59518 | NULL | Query   |    5 | User sleep | select sleep(10) |
+----+------+-----------------+------+---------+------+------------+------------------+
2 rows in set (0.00 sec)
Salin selepas log masuk

Gunakan netstat untuk melihat sambungan

netstat -an | grep 3306
tcp4       0      0  127.0.0.1.3306         127.0.0.1.59518        ESTABLISHED
tcp4       0      0  127.0.0.1.59518        127.0.0.1.3306         ESTABLISHED
tcp46      0      0  *.3306                 *.*                    LISTEN
Salin selepas log masuk

Seperti yang anda boleh lihat daripada keputusan, 20 goroutine bergilir-gilir menggunakan sambungan yang sama ( id sambungan ialah 55) untuk melaksanakan pernyataan sql.

Groutine lain akan memasuki keadaan menyekat apabila sambungan telah diduduki. Tiada goroutine lain boleh menggunakan sambungan sehingga sambungan habis.

Walaupun berbilang gorout sedang melaksanakan SQL, berbilang sambungan tidak dibuat.

Oleh itu, bilangan maksimum tetapan sambungan berkuat kuasa.

Sesetengah pembaca mungkin bertanya, jika anda belum melihat bilangan maksimum sambungan melahu yang ditetapkan, apakah bilangan maksimum sambungan ruang pada masa ini?

Seperti yang dinyatakan sebelum ini, bilangan maksimum lalai sambungan melahu ialah 2.

Mari kita uji bilangan maksimum sambungan ruang.

2. Bilangan maksimum ujian sambungan melahu

Dalam contoh berikut, tetapkan bilangan maksimum sambungan kepada 1 dan bilangan maksimum sambungan melahu kepada 0.

Dan laksanakan SQL setiap 3 saat pernyataan.

Kod adalah seperti berikut:

package main

import (
        "database/sql"
        "log"
        "time"

        _ "github.com/go-sql-driver/mysql"

)

var DB *sql.DB
var dataBase = "root:Aa123456@tcp(127.0.0.1:3306)/?loc=Local&parseTime=true"

func mysqlInit() {
        var err error
        DB, err = sql.Open("mysql", dataBase)
        if err != nil {
                log.Fatalln("open db fail:", err)
        }

        DB.SetMaxOpenConns(1)
        DB.SetMaxIdleConns(0)

        err = DB.Ping()
        if err != nil {
                log.Fatalln("ping db fail:", err)
        }
}

func main() {
        mysqlInit()

        for {
                execSql()
                time.Sleep(3*time.Second)
        }
}


func execSql() {
        var connection_id int
        err := DB.QueryRow("select CONNECTION_ID()").Scan(&connection_id)
        if err != nil {
                log.Println("query connection id failed:", err)
                return
        }

        log.Println("connection id:", connection_id)
}
Salin selepas log masuk

output:

2019/10/13 23:06:00 id sambungan: 26
2019/10 /13 23 :06:03 id sambungan: 27
2019/10/13 23:06:06 id sambungan: 28
2019/10/13 23:06:09 id sambungan: 29
2019/ 10/13 23:06:12 id sambungan: 30
2019/10/13 23:06:15 id sambungan: 31
2019/10/13 23:06:18 id sambungan: 32
2019 /10/ 13 23:06:21 id sambungan: 33
2019/10/13 23:06:24 id sambungan: 34
2019/10/13 23:06:27 id sambungan: 35
2019/10 /13 23:06:30 id sambungan: 36
2019/10/13 23:06:33 id sambungan: 37
2019/10/13 23:06:36 id sambungan: 38

Seperti yang dapat dilihat daripada keputusan, id sambungan yang digunakan adalah berbeza setiap kali SQL dilaksanakan.

Tetapkan bilangan maksimum sambungan melahu kepada 0. Selepas setiap pelaksanaan SQL, sambungan tidak akan dimasukkan ke dalam kumpulan sambungan melahu, tetapi akan ditutup pada kali berikutnya SQL dilaksanakan, sambungan baharu akan diwujudkan semula.

Atas ialah kandungan terperinci Bagaimana untuk menetapkan bilangan maksimum sambungan dan bilangan maksimum sambungan terbiar dalam golang digabungkan dengan mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!