我为dapper,ado.net和EFCore创建一个比较程序。我的问题是,如果我调用第一个精简程序,它的时间大约是7秒,而第三个EFCore精简程序的时间大约是6秒,但是如果我先调用EFCore,它的精简时间大约是7秒,第三个精简程序,则大约5秒。 这是我用于调用每个访问权限之一的代码。
for (int i = 0; i < 100; i ++)
{
string dapperSync = dapperService.SelectDapperSync();
}
for (int i = 0; i < 100; i++)
{
string adoSync = adoService.SelectAdoSync();
}
for (int i = 0; i < 100; i++)
{
string efCoreSync = eFCoreService.SelectEFCoreSync();
}
我想知道为什么会这样吗?数据库或程序中是否有任何缓存,元数据?我尝试手动关闭连接,而不是仅使用“ using”,但是结果是相同的。我使用MSSQL和.NET Core 2.1。有什么办法可以修复吗?
答案 0 :(得分:2)
Ado.Net(精简程序和实体框架所基于的)实现了connection pool-意味着第一次创建与数据库的连接时,创建实际的基础连接会产生开销-当您关闭时或处置SqlConnection
的实例,基础连接仍会在连接池中保持一段时间,因此第二次和第三次没有这种开销-SqlConnection的新实例仅使用从连接中已打开的连接连接池。
在连接池闲置了大约4-8分钟之后,或者如果连接器检测到与服务器的连接已断开,则连接池将其从池中删除。请注意,只有在尝试与服务器通信后才能检测到断开的连接。
要消除此影响,您可以在运行循环之前打开连接并立即将其关闭-该连接将具有建立第一个连接并在池中保留可用连接的开销,因此您的测试将更加准确。 / p>