Microsoft.Data.SqlClient 中的 SQL Server .NET 客户端为我们提供了一个支持操作的 IDbConnection,其中许多操作都有一个 commandTimeout 参数
。但是,我了解到 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
ing 延迟,但这也不能保证及时触发。我的代码现在看似随机挂起(可能是由于阻塞锁),如果它们抛出异常,我可以轻松处理,但目前似乎没有办法强制数据库 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
。大多数async
方法接受CancellationToken
。 IDbConnection.QueryAsync
也不异常(exception)。
您创建一个取消 token 源,它采用一个可选参数来指定取消任务之前的延迟(作为 TimeSpan
或 int
参见示例:
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/