1

注意:我不确定这是否是这篇文章最准确的标题,如果不是,请建议更好的标题。

目前我正在创建一个服务器,其中有几个处理程序(使用goji)。收到请求后,我想与我拥有的 MongoDB 数据库进行交互(使用mgo)。我的问题是:

我假设每次处理请求时都做这种事情很昂贵:

uri := os.Getenv("MONGOHQ_URL")

if uri == "" {

    panic("no DB connection string provided")
}

session, err := mgo.Dial(uri)

那么,拥有一个可以从处理程序内部访问的全局变量对我来说会更好吗?所以我会用这样的东西:

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
}

我的问题与这里的最佳做法有关?每次请求进入时打开数据库,或在整个应用程序期间保持打开状态。

4

1 回答 1

1

将处理程序包装在这样的 Controller 结构中怎么样:(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 回答