2017-05-18 77 views
2

我有一個簡單的代碼從數據庫中檢索數據,我正在使用Jmeter對它進行負載測試。我所做的是模擬1,000次請求,有時我得到所有1,000次成功的請求,有時我得到999次請求,我必須停止它,因爲它看起來像線程或最後的結果一直持續下去,這是它的外觀,注意如何最後的請求需要超過正常時間的10倍以上。如果我不阻止它,那麼這個請求會繼續下去。 enter image description hereGolang 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

我不知道是什麼導致了問題,但我沒有發現它和代碼的一些問題。 1)'get_data'中的goroutine不是必需的。直接從處理程序中查詢數據庫。 2)'result'用作格式字符串。使用'io.WriteString(w,result)'而不是'fmt.Printf'。 –

回答

2

ReadTimeOut適用於讀取由通過net/http的服務器代碼,而不是執行請求的夠程:

ReadTimeout是用於讀取的整個 請求,包括body.`

的最大持續時間

一旦請求被讀取,該值不再使用,處理程序負責決定事情是否超時。

如果要在數據庫查詢完成之前取消HTTP請求,可以使用context.Context執行此操作。

擴展req.Context,加timeout or deadline,通過這個新的背景下sql.QueryRowContext

ctx, _ := context.WithTimeout(r.Context(), 20 * time.Second) 

db.QueryRowContext(ctx, "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)