Golang中如何并发运行两个查询

Golang中如何并发运行两个查询 如何并发运行两个不同表的查询。

3 回复

使用两个不同的 Go 协程。

更多关于Golang中如何并发运行两个查询的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go func() {
  // do query 1
}()

go func() {
  // do query 2
}()

在Golang中并发运行两个不同表的查询,可以通过goroutine和channel实现。以下是示例代码:

package main

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

type QueryResult struct {
    TableName string
    Data      []map[string]interface{}
    Error     error
}

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    results := make(chan QueryResult, 2)
    var wg sync.WaitGroup

    // 并发查询表1
    wg.Add(1)
    go func() {
        defer wg.Done()
        queryTable(db, "users", results)
    }()

    // 并发查询表2
    wg.Add(1)
    go func() {
        defer wg.Done()
        queryTable(db, "orders", results)
    }()

    // 等待所有查询完成
    wg.Wait()
    close(results)

    // 处理查询结果
    for result := range results {
        if result.Error != nil {
            fmt.Printf("查询表 %s 失败: %v\n", result.TableName, result.Error)
            continue
        }
        fmt.Printf("表 %s 查询结果: %v\n", result.TableName, result.Data)
    }
}

func queryTable(db *sql.DB, tableName string, results chan<- QueryResult) {
    rows, err := db.Query(fmt.Sprintf("SELECT * FROM %s LIMIT 10", tableName))
    if err != nil {
        results <- QueryResult{TableName: tableName, Error: err}
        return
    }
    defer rows.Close()

    columns, err := rows.Columns()
    if err != nil {
        results <- QueryResult{TableName: tableName, Error: err}
        return
    }

    var data []map[string]interface{}
    for rows.Next() {
        values := make([]interface{}, len(columns))
        valuePtrs := make([]interface{}, len(columns))
        for i := range columns {
            valuePtrs[i] = &values[i]
        }

        if err := rows.Scan(valuePtrs...); err != nil {
            results <- QueryResult{TableName: tableName, Error: err}
            return
        }

        rowData := make(map[string]interface{})
        for i, col := range columns {
            val := values[i]
            b, ok := val.([]byte)
            if ok {
                rowData[col] = string(b)
            } else {
                rowData[col] = val
            }
        }
        data = append(data, rowData)
    }

    results <- QueryResult{TableName: tableName, Data: data}
}

这个示例展示了如何并发查询两个不同的数据库表。代码使用goroutine同时执行两个查询,通过channel收集结果,并使用sync.WaitGroup确保所有查询完成后再处理结果。每个查询独立执行,互不阻塞,提高了查询效率。

回到顶部