高並行データベースアクセス: GoにおけるGo WaitGroup手法

WaitGroup は、Go言語において、一連のGoroutineが実行を終えるのを待つための仕組みです。高並行のデータベースアクセスでは、すべてのデータベース操作が完了した後に後続処理を実行するためにWaitGroupを使用して、並行操作の正確性を確保できます。

WaitGroupの使用は、次の3段階で構成されています。

  1. WaitGroupオブジェクトを作成する:sync package内のWaitGroup型を使用してWaitGroupオブジェクトを作成します。
var wg sync.WaitGroup
  1. WaitGroup のカウンタに Add メソッドで待機する goroutine 数分だけ加算し、待機する goroutine のそれぞれの手前で実行する。
wg.Add(1)
  1. 各ゴルーチンが完了したらカウンタを減らす: 各ゴルーチンの実行が完了したら、Doneメソッドを使ってWaitGroupカウンタを減らします。
wg.Done()
  1. 全てのgoroutineの実行完了を待つ:Waitメソッドを使用して、全てのgoroutineが実行を完了するのを待ちます。Waitメソッドは呼び出し元のgoroutineをブロックし、カウンタが0になるまで待ちます。
wg.Wait()

高並行のデータベース アクセスの実装で WaitGroup を使用するコードの例を以下に示します。

package main
import (
"database/sql"
"fmt"
"sync"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
if err != nil {
fmt.Println("Failed to connect to database:", err)
return
}
defer db.Close()
// 并发查询数量
concurrency := 10
// 创建WaitGroup对象
var wg sync.WaitGroup
// 增加等待的goroutine数量
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(id int) {
defer wg.Done()
// 执行数据库查询操作
rows, err := db.Query("SELECT * FROM table")
if err != nil {
fmt.Println("Failed to query database:", err)
return
}
defer rows.Close()
// 处理查询结果
for rows.Next() {
// ...
}
}(i)
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All queries completed.")
}

上記のコードでは、最初にWaitGroupオブジェクトを作成し、並列クエリ数を設定します。その後、待機するgoroutine数を増加させ、WaitGroupのカウントを増やします。各goroutine内でデータベースクエリ操作を実行し、クエリが完了した後にDoneメソッドを使用してカウントを減らします。最後に、Waitメソッドを使用して全てのgoroutineの実行完了を待ちます。

WaitGroupを使用することで、全てのデータベースのクエリ処理が完了した事を確認し、その後に処理を続行することで、高並列アクセスを確立します。

bannerAds