我如何从Handler称为MongoDB Crud方法



我已经写了一个简单的mongodb软件包,其中一些crud方法:

package backend
import "labix.org/v2/mgo"
type MongoDBConn struct {
    session *mgo.Session
}
type ToDo struct {
    Title       string
    Description string
}
func NewMongoDBConn() *MongoDBConn {
    return &MongoDBConn{}
}
func (m *MongoDBConn) Connect(url string) *mgo.Session {
    session, err := mgo.Dial(url)
    if err != nil {
        panic(err)
    }
    m.session = session
    return m.session
}
func (m *MongoDBConn) Stop() {
    m.session.Close()
}
func (m *MongoDBConn) AddToDo(title, description string) (err error) {
    c := m.session.DB("test").C("people")
    err = c.Insert(&ToDo{title, description})
    if err != nil {
        panic(err)
    }
    return nil
}

我有一台服务器。我可以在其中创建HTTP服务器并为不同的URL提供处理程序。我希望能够连接到MongoDB并在特定处理程序中调用Addtodo方法。我可以从服务器的主要方法连接到DB:

import (
    "./backend"
       //other boilerplate imports
)
func AddHandler(writer http.ResponseWriter, request *http.Request) {
    log.Printf("serving %v %v", request.Method, request.URL.Path[1:])
    if request.Method != "POST" {
        serve404(writer)
        return
    }
    title := request.FormValue("title")
    description := request.FormValue("description")
    fmt.Fprintf(writer, " title description %v %v", title, description)
//I can't call mongoConn.AddToDo(title, description) from here
}    
func main() {
        //connect to mongoDB
        mongoConn := backend.NewMongoDBConn()
        _ = mongoConn.Connect("localhost")
        defer mongoConn.Stop()
    }

,但我不确定如何从处理程序调用mongoconn.addtodo(title,Description String)方法。我应该创建一个全局DB连接变量吗?

是的,全局会话是一种处理它的简单方法。然后,在每个处理程序的顶部,您可以按照以下方式进行操作:

func handler(...) {
    session := globalSession.Copy()
    defer session.Close()
}

以便每个处理程序都可以使用自己的会话。

请注意,复制和结束会议是廉价的操作,内部将在连接池上使用,而不是为创建的每个会话建立新的连接。

两个简单的方法:

1.Global数据库会话

package main

import (
    "net/http"
    "log"
    "fmt"
    "./backend"
)

var mongoConn * backend.MongoDBConn
func AddHandler(w http.ResponseWriter, r *http.Request) {
    log.Printf("serving %v %v", r.Method, r.URL.Path[1:])
    if r.Method != "POST" {
        fmt.Fprintln(w, "Not POST Method ")
        return
    }
    title := r.FormValue("title")
    description := r.FormValue("description")

    fmt.Fprintf(w, " title description %v %v", title, description)
//I can't call mongoConn.AddToDo(title, description) from here
    mongoConn.AddToDo(title, description)
}    
const AddForm = `
<html><body>
<form method="POST" action="/add">
Name: <input type="text" name="title">
Age: <input type="text" name="description">
<input type="submit" value="Add">
</form>
</body></html>
`
func Index(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, AddForm)
}
func main() {
        //connect to mongoDB

       mongoConn = backend.NewMongoDBConn()
        _ = mongoConn.Connect("localhost")
        defer mongoConn.Stop()
        http.HandleFunc("/", Index)
        http.HandleFunc("/add", AddHandler)
        log.Println("Start Server:")
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
            log.Fatal("ListenAndServe:", err)
        }
}

2.每个请求上的新DB连接

import (
    "./backend"
       //other boilerplate imports
)
func AddHandler(writer http.ResponseWriter, request *http.Request) {
    log.Printf("serving %v %v", request.Method, request.URL.Path[1:])
    if request.Method != "POST" {
        serve404(writer)
        return
    }
    title := request.FormValue("title")
    description := request.FormValue("description")
    fmt.Fprintf(writer, " title description %v %v", title, description)
    //................
    mongoConn := backend.NewMongoDBConn()
    _ = mongoConn.Connect("localhost")
    mongoConn.AddToDo(title, description)
    //....................
    mongoConn.Stop()
} 
......

更好的解决方案:

您可以创建一个DB会话池,然后在处理之前 请求您选择一个并将其放置在该请求的上下文中。然后 请求完成后,您将连接推回池。

如果池为空,则如果池已满,则创建一个新连接 您关闭连接

有关更多信息,请单击此处。

最新更新