1

いくつかの CRUD メソッドを使用して単純な MongoDB パッケージを作成しました。

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 のハンドラーを持っている server.go を持っています。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 接続変数を作成する必要がありますか?

4

2 に答える 2

3

はい、グローバル セッションはそれを処理する簡単な方法です。次に、すべてのハンドラーの上部で、次の行に沿って何かを実行できます。

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

各ハンドラーが独自のセッションを取得して動作するようにします。

セッションのコピーとクローズは安価な操作であり、作成されたすべてのセッションに対して新しい接続を確立するのではなく、接続のプールに対して内部的に機能することに注意してください。

于 2014-01-13T14:22:01.047 に答える