Golang で非同期データベース操作を実行するには、主に 2 つの方法があります: コルーチンを使用する方法: バックグラウンド スレッドでクエリを非同期に実行する方法。クエリがキャンセルされた場合、プログラムは「クエリがキャンセルされました」というメッセージを出力します。ゴルーチン プールを使用する: 大量の並列クエリを処理するアプリケーションの場合、ゴルーチン プールはコルーチンを再利用してタスクを実行できるため、パフォーマンスを向上させることができます。
非同期データベース操作を使用すると、アプリケーションはクエリ結果を待機している間も他のタスクの実行を続けることができます。これにより、特に大量のデータベース I/O を伴うアプリケーションのパフォーマンスが大幅に向上します。
Golang で非同期データベース操作を実行する一般的な方法は、コルーチン (goroutine
) を使用することです。コルーチンは、同時に実行される軽量のスレッドであり、メインスレッドと同時に実行できます。
次のコード例は、コルーチンを使用してデータベース クエリを非同期的に実行する方法を示しています:
package main import ( "context" "database/sql" "fmt" "time" ) func main() { // 打开数据库连接 db, err := sql.Open("postgres", "user=postgres password=my-password database=database host=localhost port=5432") if err != nil { panic(err) } defer db.Close() // 创建用于取消查询的上下文 ctx := context.Background() // 创建协程 go func() { // 使用 ctx.Done() 检查是否已取消查询 for { select { case <-ctx.Done(): fmt.Println("查询已取消") return default: // 执行查询 rows, err := db.QueryContext(ctx, "SELECT name FROM people") if err != nil { fmt.Println(err) continue } // 迭代查询结果 for rows.Next() { var name string if err := rows.Scan(&name); err != nil { fmt.Println(err) continue } fmt.Println(name) } rows.Close() } } }() // 等待一段时间,然后取消查询 time.Sleep(time.Second * 2) ctx.Cancel() }
このコードは、バックグラウンド コルーチンでデータベース クエリを非同期的に実行します。クエリが完了する前にキャンセルされた場合、コードは「クエリがキャンセルされました」というメッセージを出力します。
大量の並列データベース クエリを処理する必要があるアプリケーションの場合、Goroutine プールを使用するとパフォーマンスが向上します。 goroutine プールは、タスクを実行するために再利用できる管理された goroutine のセットです。
次のコード例は、非同期データベース操作に goroutine プールを使用する方法を示しています:
package main import ( "context" "database/sql" "fmt" "sync" "time" ) func main() { // 创建 goroutine pool pool := sync.Pool{ New: func() interface{} { return &sql.DB{} }, } // 打开数据库连接 db := pool.Get().(*sql.DB) defer pool.Put(db) // 创建用于取消查询的上下文 ctx := context.Background() // 创建 goroutine go func() { // 使用 ctx.Done() 检查是否已取消查询 for { select { case <-ctx.Done(): fmt.Println("查询已取消") return default: // 执行查询 rows, err := db.QueryContext(ctx, "SELECT name FROM people") if err != nil { fmt.Println(err) continue } // 迭代查询结果 for rows.Next() { var name string if err := rows.Scan(&name); err != nil { fmt.Println(err) continue } fmt.Println(name) } rows.Close() } } }() // 等待一段时间,然后取消查询 time.Sleep(time.Second * 2) ctx.Cancel() }
このコードは前の例と似ていますが、コルーチンを管理するために goroutine プールを使用します。これにより、新しいコルーチン作成のオーバーヘッドが軽減され、パフォーマンスが向上します。
以上がGolang で非同期データベース操作を行うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。