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

标签 c# sql-server .net-core dapper .net-5

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基于 awaiting 延迟,但这也不能保证及时触发。我的代码现在看似随机挂起(可能是由于阻塞锁),如果它们抛出异常,我可以轻松处理,但目前似乎没有办法强制数据库 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方法接受CancellationTokenIDbConnection.QueryAsync 也不异常(exception)。

您创建一个取消 token 源,它采用一个可选参数来指定取消任务之前的延迟(作为 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/

相关文章:

c# - 字符串插值中可避免的装箱

c# - ValueTuple 对大对象有多好?

Python SQLAlchemy : Data source name not found and no default driver specified

sql - 关于自引用表的删除级联

sql-server - SQL Server : Best technique to regenerate a computed table

c# - 包括不在 LINQ 查询中工作但在 LINQ Fluent API 中工作

c# - C# 和 C 中的枚举关键字有什么区别?

asp.net-mvc - 我可以在运行时更新我的​​ asp 核心站点吗?

asp.net-core - .NET Core 上的 X509Certificate2.CreateFromCertFile()

c# - DbContextOptionsBuilder 不包含 'UseSqlServer' 的定义