91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

golang并發查詢數據庫怎么實現

小億
143
2023-10-25 19:01:34
欄目: 編程語言

在Go語言中實現并發查詢數據庫可以使用goroutine和channel來實現。以下是一個簡單的示例代碼:

package main
import (
    "database/sql"
    "fmt"
    "log"
    "sync"
    _ "github.com/go-sql-driver/mysql"
)

type Result struct {
    ID   int
    Name string
}

func dbQuery(db *sql.DB, query string, resultChan chan<- Result, wg *sync.WaitGroup) {
    defer wg.Done()

    rows, err := db.Query(query)
    if err != nil {
        log.Printf("Error executing query: %s\n", err)
        return
    }
    defer rows.Close()

    for rows.Next() {
        var result Result
        err := rows.Scan(&result.ID, &result.Name)
        if err != nil {
            log.Printf("Error scanning result: %s\n", err)
            return
        }
        resultChan <- result
    }
}

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    if err != nil {
        log.Fatalf("Error connecting to database: %s\n", err)
    }
    defer db.Close()

    queries := []string{"SELECT id, name FROM table1", "SELECT id, name FROM table2"}

    resultChan := make(chan Result)
    var wg sync.WaitGroup

    for _, query := range queries {
        wg.Add(1)
        go dbQuery(db, query, resultChan, &wg)
    }

    go func() {
        wg.Wait()
        close(resultChan)
    }()

    for result := range resultChan {
        fmt.Printf("ID: %d, Name: %s\n", result.ID, result.Name)
    }
}

上述代碼中,我們首先建立數據庫連接,然后定義一個Query函數,該函數接受一個SQL查詢語句和一個結果通道,通過查詢語句從數據庫中獲取數據,并將結果發送到結果通道中。

在主函數中,我們定義了一個查詢語句的切片,然后創建了一個結果通道和一個等待組。接著,我們遍歷查詢語句切片,為每個查詢語句啟動一個goroutine來執行查詢操作。在goroutine中,我們調用Query函數來執行數據庫查詢,并將結果發送到結果通道中。

最后,我們在主函數中啟動一個goroutine來等待所有的查詢操作完成,并在所有結果都被處理后關閉結果通道。然后遍歷結果通道,輸出查詢結果。

這樣我們就實現了并發查詢數據庫的功能。

0
冕宁县| 横山县| 德化县| 全椒县| 河池市| 嵩明县| 扶绥县| 新宁县| 富阳市| 林西县| 东丰县| 宕昌县| 禹州市| 基隆市| 华宁县| 满城县| 万州区| 多伦县| 自贡市| 娄烦县| 普陀区| 南宫市| 安溪县| 神农架林区| 靖远县| 桦南县| 蓬莱市| 合肥市| 沂南县| 全州县| 新蔡县| 兴化市| 深州市| 文水县| 黔西县| 伊宁市| 大荔县| 边坝县| 嘉禾县| 西城区| 崇州市|