我有一个从数据库中检索数据的简单代码,我正在使用Jmeter对其执行负载测试。我正在做的是模拟1,000个请求,有时我得到所有1,000个成功请求,有时我得到999个请求,我必须停止它,因为看起来这个线程或最后结果一直在无限下去,这就是它的外观,注意如何最后一个请求需要超过正常时间的10倍。如果我不阻止它,那么该请求将一直持续下去。
这是我的代码
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会破坏连接,但似乎它没有
答案 0 :(得分:2)
ReadTimeOut
适用于net/http
服务器代码所做的读取,而不适用于执行请求的goroutine:
ReadTimeout是读取整个时间的最长时间 要求,包括身体。
一旦读取了请求,就不再使用此值,并且处理程序负责决定事情是否已超时。
如果要在数据库查询完成之前取消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)