C#,Dapper,SQL Server和连接池

时间:2017-05-09 15:57:34

标签: c# sql-server connection-pooling dapper

我已经编写了一些代码,使用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应该自动处理连接池吗?

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

谢谢Juharr - 我已经对你的回复进行了投票。

为了参考其他人,我将写入函数更改为await和Dapper async:

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

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

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