gpt4 book ai didi

go - 最佳实践开放数据库

转载 作者:IT王子 更新时间:2023-10-29 02:16:55 25 4
gpt4 key购买 nike

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

目前我正在创建一个服务器,其中有几个处理程序(使用 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
}

我的问题是这里的最佳实践是什么?每次请求进入时打开数据库,或者在整个应用程序期间保持打开状态。

最佳答案

如何将您的处理程序包装在 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()
}

这样,您就可以将 session 嵌入到处理程序中,并添加您可能需要的任何其他数据。

关于go - 最佳实践开放数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25570321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com