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)閉該連接

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ì)話建立新的連接。
- 2 回答
- 0 關(guān)注
- 225 瀏覽
添加回答
舉報(bào)