Golang中如何并发运行两个查询
Golang中如何并发运行两个查询 如何并发运行两个不同表的查询。
3 回复
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确保所有查询完成后再处理结果。每个查询独立执行,互不阻塞,提高了查询效率。

