第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么多個 sql 查詢按順序運行而不是同時運行?

為什么多個 sql 查詢按順序運行而不是同時運行?

Go
慕虎7371278 2023-06-19 16:07:22
我同時在單獨的 go 例程中運行 mysql “select” 查詢。然而,mysql 服務(wù)似乎收集這些查詢,按順序(不是同時)運行它們,然后同時返回所有結(jié)果集,并且只有在所有查詢都運行之后。我的問題是:1. 為什么這些查詢按順序運行而不是同時運行?2. 為什么 mysql 等到所有查詢都運行后再同時返回每個查詢的結(jié)果集(即使每個結(jié)果集屬于不同的 go routine 并且據(jù)說也使用單獨的連接)?另一件事:當我設(shè)置“SetMaxOpenConns(2)”時,它會同時返回兩個結(jié)果集。如果設(shè)置為 3,則同時返回 3 個結(jié)果集。但是它們?nèi)匀豢偸前错樞蜻\行。有人知道這里發(fā)生了什么嗎?package mainimport (    "database/sql"    "fmt"    "sync"    "time"    _ "github.com/go-sql-driver/mysql")var database *sql.DBfunc init() {    var err error    databaseURI := "root:toor@tcp(192.168.200.10:3306)/ahc"    database, err = sql.Open("mysql", databaseURI)    if err != nil {        fmt.Println(err)    } else {        fmt.Println("DB Connection Established")        //database.SetMaxIdleConns(0)        //database.SetMaxOpenConns(2)    }}func test(device string, wg *sync.WaitGroup) {    fmt.Println("Thread: " + device + " started")    start := time.Now()    var count string    //using go-sql-driver    sqlStatement, err := database.Prepare("select count(cpeName) from report where errMessage <> \"ok\" and cpeName = ? and jobID = ?")    if err != nil {        fmt.Println(err)    }    defer sqlStatement.Close()    err = sqlStatement.QueryRow(device, "11534").Scan(&count)    sqlStatement.Close()    duration := time.Since(start)    fmt.Println("Thread: " + device + " Duration: " + duration.String() + "\n")    wg.Done()}func main() {    var wg sync.WaitGroup    var deviceList = []string{"xx-swrk-ca-gen-s-002", "xx-leus-ca-ust-ap-068", "xx-sgvn-ca-lug-ap-004", "xx-swrk-ca-vez-s-005", "xx-swrk-ca-vez-ap-006",    "xx-leus-ca-ust-ap-065", "xx-leus-ca-ust-ap-073", "xx-leus-ca-ust-ap-076", "xx-leus-ca-ust-ap-077", "xx-swrk-ca-gen-s-001"}    total := time.Now()    for _, device := range deviceList {        wg.Add(1)        go test(device, &wg)    }    wg.Wait()    duration := time.Since(total)    fmt.Println("\n\nTotal: Duration: " + duration.String() + "\n")}
查看完整描述

1 回答

?
BIG陽

TA貢獻1859條經(jīng)驗 獲得超6個贊

一種查看它們是并行運行還是串行運行的簡單技術(shù):讓每個連接都執(zhí)行

SELECT SLEEP(1);

如果是并行的,設(shè)置不會超過 1 秒。如果連續(xù),則 N 秒。

如果它們按順序運行,但在全部完成之前沒有輸出,那將是一個 GO 問題。

如果您的 7.3 真的是并行的而 9.5 是串行的,那么這就指出了為什么并行運行事物是不值得的——它們會相互踩踏并且完成得不會更快。沖突可能是 CPU 或 I/O 或互斥體或網(wǎng)絡(luò)或其他東西;這取決于查詢。(我的sleep測試是非侵入性的,但需要可預(yù)測的時間。)


查看完整回答
反對 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號