【问题标题】:Why access to the database is faster depending on order of calls to database?为什么根据调用数据库的顺序访问数据库更快?
【发布时间】:2019-03-25 18:41:37
【问题描述】:

我为 dapper、ado.net 和 EFCore 创建了一个比较程序。我的问题是,如果我调用第一个 dapper 大约需要 7 秒,第三个 EFCore 大约有 6 秒,但是如果我首先调用 EFCore 它大约有 7 秒,第三个 dapper 大约有 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();
        }

我想知道为什么会这样?数据库或程序中是否有任何缓存、元数据?我尝试手动关闭连接,而不是只使用“使用”,但结果是一样的。我使用 MSSQL 和 .NET Core 2.1。有什么办法可以修复吗?

【问题讨论】:

    标签: c# asp.net .net sql-server .net-core


    【解决方案1】:

    Ado.Net(dapper 和实体框架所基于)实现了connection pool - 这意味着您第一次创建与数据库的连接时,会产生创建实际底层连接的开销 - 以及当您关闭或处置时SqlConnection 的实例,底层连接在连接池中仍然可用一段时间,所以第二次和第三次没有那个开销——SqlConnection 的新实例只是使用连接池中已经打开的连接。

    连接池在空闲大约 4 到 8 分钟后,或者如果池检测到与服务器的连接已被切断,则从池中删除连接。请注意,只有在尝试与服务器通信后才能检测到断开的连接。

    为了消除这种影响,您可以在运行循环之前立即打开连接并关闭它 - 此连接将产生建立第一个连接并在池中保持可用连接的开销,以便您的测试更加准确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多