gpt4 book ai didi

c# - 由于 commandTimeout 不够健壮,如何使用 Dapper 在 C# 中的阻塞/慢速数据库操作上获得可靠的超时?

转载 作者:行者123 更新时间:2023-12-04 08:12:07 28 4
gpt4 key购买 nike

Microsoft.Data.SqlClient 中的 SQL Server 的 .NET Client 为我们提供了一个支持操作的 IDbConnection,其中很多都有一个 commandTimeout parameter .然而,我了解到commandTimeout应用在较低的级别和 does not guarantee or even always try to timeout if the whole operation exceeds that time . (我正在使用 Dapper 的 QueryAsync ,但我认为任何数据库访问方法都会遇到同样的问题。)
那么我该如何设置以便我可以超时或以其他方式抛出异常?我试过 creating a WithTimeout extension method基于 await延迟,但也不能保证及时触发。我的代码现在看似随机挂起(可能是由于阻塞锁),如果他们抛出异常我可以轻松处理,但目前似乎没有办法强制数据库 QueryAsync手术。如何使用 Dapper 在 C# 中获得阻塞/缓慢数据库操作的真正超时?
Dapper 似乎不支持取消 token 。 是否有更广泛的查询数据库的方法可以保证在特定时间内完成或出错 ,说 20 秒?

最佳答案

Is there some broader approach to querying the database that could guarantee either completion or an error in a certain time, say 20 seconds?


就在这里。有一种更广泛的方法来执行异步 IO,以保证在指定时间内完成或出错。
在 C# 中,可以创建 CancellationToken s 在给定的时间跨度后被取消。最 async方法接受 CancellationToken . IDbConnection.QueryAsync也不异常(exception)。
您创建了一个取消标记源,它采用一个可选参数指定任务取消之前的延迟(作为 TimeSpanint见示例:
try
{
IDbConnection db = ...;
var cts = new CancellationTokenSource(10_000);
var cmd = new CommandDefinition(commandText: "your query", cancellationToken: cts.Token);
await db.QueryAsync<Foo>(cmd);
// Success.
}
catch (TaskCanceledException e)
{
// Failure due to timeout.
}

关于c# - 由于 commandTimeout 不够健壮,如何使用 Dapper 在 C# 中的阻塞/慢速数据库操作上获得可靠的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65902725/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com