C#, Dapper, SQL Server and Connection Pooling



我已经编写了一些代码来使用Dapper将一些数据写入SQL Server。 在继续其他工作之前,我不需要等待此写入完成,因此希望使用 Task.Run() 进行异步处理。

我有(使用)语句在我的系统的其余部分调用它:

using (IDataAccess ida = new DAL())
{
ida.WriteMessageToDB(id, routingKey, msgBody);
}

我的 DAL 将在运行 using 语句时自动检查 dbConnection.State,并在关闭时尝试简单的修复。 这适用于任何非异步/TPL 选择调用。

但是,当我同时抛出大量写入时,Task.Run() 代码会随着其中一些的连接关闭而崩溃 - 本质上我认为代码的并行性质意味着状态被其他任务关闭。

我通过检查在 Task.Run() 代码中打开 Connection.State 来"修复"这个问题,这似乎已经"解决"了这个问题。 这样:

Task.Run(() =>
{
if (dbConnection.State == ConnectionState.Closed)
{
dbConnection.Open();
}
if (dbConnection.State == ConnectionState.Open)
{
*Dapper SQL String and Execute Commands*
}
});

在此之后,当我从 SSMS 运行SELECT * FROM sys.dm_exec_connections时,我看到更多的连接。 意料之中?

现在据我了解:

  • Dapper 不处理连接池
  • SQL Server 应该自动处理连接池吗?

这个解决方案有什么问题吗? 还是更好的方法? 出于显而易见的原因,我想使用连接池,并且尽可能轻松。

提前谢谢。

谢谢 Juharr - 我已经对你的回复投了赞成票。

为了参考其他人,我将写入函数更改为等待和 Dapper 异步:

private async Task WriteMessageToDB(Guid id, string tableName, string jsonString)
{
string sql = *Redacted*
await dbConnection.ExecuteScalarAsync<int>(sql, new { ID = id, Body = jsonString });
}

然后在调用方中创建了一个监视结果的新任务。

这在负载下始终有效,并且也没有看到创建过多的新连接。

最新更新