如何在gorm中为长时间运行的查询设置超时

在运行长查询时,有没有办法可以将 gorm 设置为在可配置的时间段后超时?我正在使用 mssql。我浏览了文档,还没有找到方法。



繁华开满天机
浏览 737回答 2
2回答

Qyouu

这段代码似乎对我有用,而且很干净。我猜只是使用交易。    //Gorm query belowquery = query.Where(whereClause)//Set up Timeoutctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()var x sql.TxOptionsdb := query.BeginTx(ctx, &x)defer db.Commit()// Execute the queryif err := db.Find(*results).Error; err != nil {    return err}

幕布斯7119047

目前,gorm 似乎没有context.Context像 eg那样实现任何接受作为参数 a 的查询QueryRowContext。您可以创建一种解决方法并使用 Context 使您的查询“过期”。type QueryResponse struct {&nbsp; &nbsp; MyResult *MyResult&nbsp; &nbsp; Error&nbsp; &nbsp; error}func queryHelper(ctx context.Context) <- chan *QueryResponse {&nbsp; &nbsp; chResult := make(chan *QueryResponse, 1)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; //your query here&nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; //blah blah check stuff do whatever you want&nbsp; &nbsp; &nbsp; &nbsp; //err is an error that comes from the query code&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; chResult <- &QueryResponse{nil, err}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; chResult <- &QueryResponse{queryResponse, nil}&nbsp; &nbsp; } ()&nbsp; &nbsp; return chResult}func MyQueryFunction(ctx context.Context) (*MyResult, error) {&nbsp; &nbsp; select {&nbsp; &nbsp; case <-ctx.Done():&nbsp; &nbsp; &nbsp; &nbsp; return nil, fmt.Errorf("context timeout, query out of time")&nbsp; &nbsp; case res := <-queryHelper(ctx):&nbsp; &nbsp; &nbsp; &nbsp; return res.MyResult, res.Error&nbsp; &nbsp; }}然后在您的上层函数中,无论它是什么,您都可以创建一个上下文并将其传递给MyQueryFunction. 如果查询超过了您设置的时间,则会引发错误,您应该(必须)检查它。ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)defer cancel()res, err := MyQueryFunction(ctx)if err != nil {&nbsp; &nbsp; fmt.Printf("err %v", err)} else {&nbsp; &nbsp; fmt.Printf("res %v", res)}当然,这只是一个例子,没有考虑很多用例,必须首选框架内的正确实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go