并行调用存储进程——值得
本文关键字:值得 进程 存储 调用 并行 | 更新日期: 2023-09-27 18:08:02
我在一个ASP中找到了这个代码。. NET应用程序。
var task1 = Task.Run(() => CallStoredProc1());
var task2 = Task.Run(() => CallStoredProc2() );
...
var task8 = Task.Run(() => CallStoredProc8() );
Task.WaitAll(task1, task2, ..., task8);
这8个存储进程都是在同一个SQL Server数据库上的简单查询。
在这种情况下,引入并行性的开销是否"值得"调用8个存储过程调用的可忽略不计的节省?如果没有,有什么建议给这个反模式起个好名字吗?
不值得。
单独的线程只执行Sql数据库过程是浪费线程资源。在你的例子中,实际上在var task1 = Task.Run(() => CallStoredProc1());
行中创建的线程不会做任何有用的事情——只是等待数据库的响应。
改为使用ADO.NET
的异步方法,使CallStoredProc1()
和CallStoredProc2()
方法异步。然后你可以在ASP.NET
应用程序中使用它们
Task proc1 = CallStoredProc1Async();
Task proc2 = CallStoredProc2Async();
await Task.WhenAll(proc1, proc2);
通过这种方式,两个过程都将被发送到数据库,在等待响应的同时,当前线程将被释放(返回到线程池)。当任务即将完成时,继续执行线程池中的另一个线程。
public async Task CallStoredProc1()
{
using(var conn = new Connection("yourConnectionString"))
{
using(var command = new SqlCommand("Procedure1", conn))
{
CommandType = CommandType.StoredProcedure;
await conn.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
}