Open3

【Go】DB操作が絡む大量リクエストを捌くための試作について調べる

aa

アンチパターン:DB接続の使い回し不足

func handler(w http.ResponseWriter, r *http.Request) {
    // 毎回新しいデータベース接続を作成している
    db, err := sql.Open("mysql", "user:password@/dbname")
    if err != nil {
        http.Error(w, "Internal Server Error", http.StatusInternalServerError)
        return
    }
    defer db.Close()

    // データベース操作
}

リクエスト毎にsql.Open が呼び出されてしまうため、DB接続を確立する処理のオーバーヘッドが大きくなってしまう。

aa

解決策:DBインスタンスをグローバル変数として利用する

var db *sql.DB

func init() {
    var err error
    db, err = sql.Open("mysql", "user:password@/dbname")
    if err != nil {
        log.Fatal(err)
    }
}

func handler(w http.ResponseWriter, r *http.Request) {
    // ここでは db を使い回す
    // データベース操作
}

こんな感じ。

aa

ちな、関数名をinitにしておくとmain関数よりも前に勝手に処理してくれるので、DBクライアントとか、Redisでもこの辺りに書いておくとよい。