2
我有一個簡單的代碼從數據庫中檢索數據,我正在使用Jmeter對它進行負載測試。我所做的是模擬1,000次請求,有時我得到所有1,000次成功的請求,有時我得到999次請求,我必須停止它,因爲它看起來像線程或最後的結果一直持續下去,這是它的外觀,注意如何最後的請求需要超過正常時間的10倍以上。如果我不阻止它,那麼這個請求會繼續下去。 Golang http連接無限期地持續
這是我的代碼
func get_data(w http.ResponseWriter, r *http.Request) {
var result string
r.ParseForm()
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
db.QueryRow("select json_build_object('Locations', array_to_json(array_agg(t))) from (SELECT latitudes,county,longitudes,"+
"statelong,thirtylatmin,thirtylatmax,thirtylonmin,thirtylonmax,city"+
" FROM zips where city='Orlando' ORDER BY city limit 5) t").Scan(&result)
}()
wg.Wait()
fmt.Fprintf(w,result)
}
然後,我有我的數據庫連接
var db *sql.DB
func init() {
var err error
db, err = sql.Open("postgres", Postgres_Connect)
if err != nil {
log.Fatal("Invalid DB config:", err)
println("Invalid DB config:")
//log_errors("HomePage-Postgres: error opening database",err)
}
if err = db.Ping(); err != nil {
log.Fatal("DB unreachable:", err)
println()
}
}
,這裏是我的HTTP服務器
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
r := mux.NewRouter()
r.HandleFunc("/mydata",Controllers.Get_Data)
http.Handle("/",r)
srv := &http.Server{
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 120 * time.Second,
Addr: ":8000",
}
log.Println(srv.ListenAndServe())
}
我希望在ReadTimeOut會殺死連接,但似乎沒有
我不知道是什麼導致了問題,但我沒有發現它和代碼的一些問題。 1)'get_data'中的goroutine不是必需的。直接從處理程序中查詢數據庫。 2)'result'用作格式字符串。使用'io.WriteString(w,result)'而不是'fmt.Printf'。 –