1

注:これがこの投稿の最も正確なタイトルかどうかはわかりません。そうでない場合は、より適切なタイトルを教えてください。

現在、いくつかのハンドラーを持つサーバーを作成しています ( gojiを使用)。リクエストを受け取った後、私が持っている MongoDB データベースとやり取りしたい ( mgoを使用)。私の質問は:

リクエストを処理するたびにこの種のことを行うのは費用がかかると想定しています。

uri := os.Getenv("MONGOHQ_URL")

if uri == "" {

    panic("no DB connection string provided")
}

session, err := mgo.Dial(uri)

では、ハンドラー内からアクセスできるグローバル var を用意した方がよいでしょうか? だから私はこのようなものに行きます:

var session *mgo.Session

func main() {

    session = setupDB()
    defer session.Close()

    goji.Get("/user", getUser)
    goji.Serve()
}

func getUser(c web.C, w http.ResponseWriter, r *http.Request) {
// Use the session var here
}

私の質問は、ここでのベストプラクティスは何ですか? リクエストが来るたびに DB を開くか、アプリケーションの全期間にわたって DB を開いたままにします。

4

1 に答える 1

1

次のようにコントローラー構造体でハンドラーをラップするのはどうですか: ( http://play.golang.org/p/NK6GO_lqgk )

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

type Controller struct {
    session *Session
}

func NewController() (*Controller, error) {
    if uri := os.Getenv("MONGOHQ_URL"); uri == "" {
        return nil, fmt.Errorf("no DB connection string provided")
    }
    session, err := mgo.Dial(uri)
    if err != nil {
        return nil, err
    }
    return &Controller{
        session: session,
    }, nil
}

func (c *Controller) getUser(c web.C, w http.ResponseWriter, r *http.Request) {
    // Use the session var here
}

func main() {
    ctl, err := NewController()
    if err != nil {
        log.Fatal(err)
    }
    defer ctl.session.Close()

    goji.Get("/user", ctl.getUser)
    goji.Serve()
}

このようにして、セッションをハンドラーに埋め込み、必要なその他のデータを追加できます。

于 2014-08-29T14:55:42.383 に答える