注意:我不确定这是否是此帖子最准确的标题,如果没有,请告知更好的标题。
目前我正在创建一个服务器,我有几个处理程序(使用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
}
我的问题与这里的最佳做法有关?每次请求进入时打开数据库,或在应用程序的整个持续时间内保持打开状态。
答案 0 :(得分: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()
}
这样,您可以将会话嵌入到处理程序中,并添加您可能需要的任何其他数据。