当我在asp.net服务中进行性能问题的基准测试时,我意外地发现SqlConnection.Open
的性能远好于SqlConnection.OpenAsync
(更多细节见下文)。
从源代码来看,Open
的代码只是OpenAsync
的一个子集。此处差异
我很好奇,如果Open
和OpenAsync
做的事情完全一样,那么使用异步版本(如果有的话)有什么好处?
详细信息:
这就是我创建连接的方式
using (SqlConnection connection = new SqlConnection(connectionString))
{
await connection.OpenAsync();
// run actual operation on connection (in an async way)
}
此代码块13 seconds on an average for 100 concurrent calls
。我已经尝试将线程池计数增加到200,以减少tasks
等待线程的机会。即使在让默认线程池计数之后,观察结果也不会改变。
有趣的是,如果我用connection.Open()
更改await connection.OpenAsync()
,性能会提高10倍。CCD_ 11。
我试着玩connection pool settings
,看起来即使我把它减少到一个任意低的数字(2是测试的数字),这个数字也不会有太大变化。
驱动程序代码为:
Task.WhenAll(Enumerable.Range(0, maxConcurrentCalls).Select((idx) => CallQuery(idx))).Result;
我之所以等待(通过执行.Result
是因为驱动程序代码是一个控制台应用程序,它必须具有同步main
)。在实际生产代码中,包括控制器在内的所有内容都是async
。
我使用OpenAsync的一种方法是,如果我有到多个数据库的开放连接。
Task t = conn1.OpenAsync();
conn2.Open();
t.Wait();
如果与远程服务器的连接速度较慢,则Open可能需要几秒钟的时间。通过这种方式,两个公开赛同时进行。