Open3
【Go】DB操作が絡む大量リクエストを捌くための試作について調べる
アンチパターン: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接続を確立する処理のオーバーヘッドが大きくなってしまう。
解決策: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 を使い回す
// データベース操作
}
こんな感じ。
ちな、関数名をinit
にしておくとmain
関数よりも前に勝手に処理してくれるので、DBクライアントとか、Redisでもこの辺りに書いておくとよい。