我有一个简单的代码,可以从数据库中检索数据,并且正在使用Jmeter对它执行负载测试。我正在做的是模拟1,000个请求,有时我会收到所有1,000个成功的请求,有时我会得到999个请求,而我不得不停止它,因为似乎线程或最后结果会无限期地继续下去,这就是它的样子,请注意最后一个请求花费的时间是正常时间的10倍以上。如果我不停止它的话,这个请求将会不断发生。
go - Golang HTTP连接无限期持久-LMLPHP

这是我的代码

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可以终止连接,但似乎并没有

最佳答案

ReadTimeOut 适用于net/http的服务器代码进行的读取,不适用于执行请求的goroutine:



读取请求后,将不再使用该值,并且处理程序负责确定事情是否超时。

如果要在数据库查询完成之前取消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)

关于go - Golang HTTP连接无限期持久,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44059263/

10-12 22:05
查看更多