在我的控制器的开头,我创建了一个带有超时的上下文:
ctx, cancel := context.WithTimeout(context.Background(), time.Second * 10)
defer cancel()
然后我在每个数据库请求中使用此上下文,如下所示:
QueryRowContext(ctx, query, ...args) // where ctx is context
但是,当我加载测试程序时,我注意到我的一些请求返回错误"pq: canceling statement due to user request"
。而且我提出的请求越多,我得到的错误就越多。
但是,如果我不使用带有超时的上下文,而只使用context.Background()
,那么无论请求数量多少,我都不会收到任何错误。
每个请求大约需要50毫秒,因此不会发生超时。我尝试了取消context.WithCancel(context.Background())
的上下文,我也遇到了这些错误。
出现这些错误的原因可能是什么?
// create context to cancel working if 10 seconds passed
ctx, cancel := context.WithTimeout(context.Background(), time.Second * 10)
defer cancel()
// parses queries
var response []byte
request := model.GetProductByBarcodeRequest{}
barcode := r.URL.Query().Get("barcode")
storeID := r.URL.Query().Get("store_id")
transactionType := r.URL.Query().Get("type")
request.Barcode = &barcode
request.StoreID = &storeID
request.Type = &transactionType
// processing
result, err := model.GetProductByBarcode(ctx, request)
response = controller.ToJson(result, err)
// writing response to user
w.Write(response)