第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何從處理程序調(diào)用mongoDB CRUD方法?

如何從處理程序調(diào)用mongoDB CRUD方法?

Go
梵蒂岡之花 2021-05-14 18:06:11
我用一些CRUD方法編寫了一個(gè)簡(jiǎn)單的MongoDB軟件包:package backendimport "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}我有一個(gè)server.go,在其中創(chuàng)建Http Server并具有用于不同URL的處理程序。我希望能夠連接到MongoDB并在特定處理程序中調(diào)用AddToDo方法。我可以從服務(wù)器的主要方法連接到數(shù)據(jù)庫(kù):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()    }但是我不確定如何從處理程序中調(diào)用mongoConn.AddToDo(title,description string)方法。我應(yīng)該創(chuàng)建一個(gè)全局?jǐn)?shù)據(jù)庫(kù)連接變量嗎?
查看完整描述

2 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

兩種簡(jiǎn)單的方法:


1.全局?jǐn)?shù)據(jù)庫(kù)會(huì)話


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.每個(gè)請(qǐng)求都有一個(gè)新的數(shù)據(jù)庫(kù)連接


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()



......

更好的解決方案:


您可以創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)會(huì)話池,然后在處理請(qǐng)求之前選擇一個(gè)并放入該請(qǐng)求的上下文中。然后,在完成請(qǐng)求后,將連接推回池中。


如果該池為空,則創(chuàng)建一個(gè)新的連接;如果該池已滿,則關(guān)閉該連接



查看完整回答
反對(duì) 回復(fù) 2021-05-24
?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

是的,全球會(huì)議是處理此問題的簡(jiǎn)便方法。然后,在每個(gè)處理程序的頂部,您可以執(zhí)行以下操作:


func handler(...) {

    session := globalSession.Copy()

    defer session.Close()

}

這樣每個(gè)處理程序都可以使用自己的會(huì)話。


請(qǐng)注意,復(fù)制和關(guān)閉會(huì)話是廉價(jià)的操作,在內(nèi)部將對(duì)連接池起作用,而不是為每個(gè)創(chuàng)建的會(huì)話建立新的連接。


查看完整回答
反對(duì) 回復(fù) 2021-05-24
  • 2 回答
  • 0 關(guān)注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)