在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來等待所有的查詢操作完成,并在所有結果都被處理后關閉結果通道。然后遍歷結果通道,輸出查詢結果。
這樣我們就實現了并發查詢數據庫的功能。