Open和OpenAsync(SqlConnection)之间的区别



当我在asp.net服务中进行性能问题的基准测试时,我意外地发现SqlConnection.Open的性能远好于SqlConnection.OpenAsync(更多细节见下文)。

从源代码来看,Open的代码只是OpenAsync的一个子集。此处差异

我很好奇,如果OpenOpenAsync做的事情完全一样,那么使用异步版本(如果有的话)有什么好处?

详细信息:

这就是我创建连接的方式

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可能需要几秒钟的时间。通过这种方式,两个公开赛同时进行。

最新更新