为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁华开满天机 2022-06-21 10:53:45
在运行长查询时,有没有办法可以将 gorm 设置为在可配置的时间段后超时?我正在使用 mssql。我浏览了文档,还没有找到方法。
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

这段代码似乎对我有用,而且很干净。我猜只是使用交易。


    //Gorm query below

query = query.Where(whereClause)

//Set up Timeout

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

defer cancel()

var x sql.TxOptions

db := query.BeginTx(ctx, &x)

defer db.Commit()

// Execute the query

if err := db.Find(*results).Error; err != nil {

    return err

}


查看完整回答
反对 回复 2022-06-21
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

目前,gorm 似乎没有context.Context像 eg那样实现任何接受作为参数 a 的查询QueryRowContext。

您可以创建一种解决方法并使用 Context 使您的查询“过期”。


type QueryResponse struct {

    MyResult *MyResult

    Error    error

}


func queryHelper(ctx context.Context) <- chan *QueryResponse {

    chResult := make(chan *QueryResponse, 1)

    go func() {

        //your query here

        //...

        //blah blah check stuff do whatever you want

        //err is an error that comes from the query code

        if err != nil {

            chResult <- &QueryResponse{nil, err}

            return

        }

        chResult <- &QueryResponse{queryResponse, nil}

    } ()

    return chResult

}


func MyQueryFunction(ctx context.Context) (*MyResult, error) {

    select {

    case <-ctx.Done():

        return nil, fmt.Errorf("context timeout, query out of time")


    case res := <-queryHelper(ctx):

        return res.MyResult, res.Error

    }

}

然后在您的上层函数中,无论它是什么,您都可以创建一个上下文并将其传递给MyQueryFunction. 如果查询超过了您设置的时间,则会引发错误,您应该(必须)检查它。


ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)

defer cancel()

res, err := MyQueryFunction(ctx)

if err != nil {

    fmt.Printf("err %v", err)

} else {

    fmt.Printf("res %v", res)

}

当然,这只是一个例子,没有考虑很多用例,必须首选框架内的正确实现。


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 668 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号