Phi*_*l S 8 c# sql-server connection-pooling dapper
我已经编写了一些代码来使用Dapper将一些数据写入SQL Server.在继续其他工作之前,我不需要等待这个写完成,所以想要使用Task.Run()来使这个异步.
我有(使用)语句在我的系统的其余部分调用它:
using (IDataAccess ida = new DAL())
{
ida.WriteMessageToDB(id, routingKey, msgBody);
}
Run Code Online (Sandbox Code Playgroud)
运行using语句时,我的DAL将自动检查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*
}
});
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM sys.dm_exec_connections在此之后我从SSMS 运行时,我看到了更多的连接.可以预料?
据我所知:
这个解决方案有什么问题吗?或者更好的方法呢?我想使用连接池,原因很明显,并且尽可能无痛.
提前致谢.
谢谢 Juharr - 我已经对你的回复投了赞成票。
为了参考其他人,我将 write 函数更改为 wait 和 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 });
}
Run Code Online (Sandbox Code Playgroud)
然后在调用者中创建一个新任务来监视结果。
这在负载下持续工作,并且也没有看到创建过多的新连接。
| 归档时间: |
|
| 查看次数: |
2190 次 |
| 最近记录: |