【问题标题】:What is the difference between pooling at Entity Framework vs SQL Server level?实体框架与 SQL Server 级别的池有什么区别?
【发布时间】:2022-02-17 04:57:32
【问题描述】:

我有一个托管在服务器 A 上的 .NET 6 Web API。SQL Server 在服务器 B 上。两台服务器都在同一个网络中。

Web API 的每个端点都使用实体框架从数据库中查询数据。

我想在实体框架级别启用池,以便重用连接。但我正在阅读 SQL Server 无论如何都有自己的连接池。链接:https://docs.microsoft.com/en-us/ef/core/performance/advanced-performance-topics?tabs=with-di%2Cwith-constant#dbcontext-pooling

请注意,DbContext 池与数据库连接正交 池化,它在数据库驱动程序中的较低级别进行管理。

所以我想问一下——Entity Framework 和 SQL Server 级别的池有什么区别?

【问题讨论】:

  • 注意“SQL Server 级别”是 ADO.NET,而不是数据库服务器。 ADO.NET 和 DbContext 池都是客户端的。

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


【解决方案1】:

我想在实体框架级别启用池,以便重用连接

实体框架不涉及“连接被重用”级别。在这方面,池化是 ADO.net 锻造的过程,例如与数据库的 TCP 连接(这是一个相对较长且资源密集型的操作)并保持打开状态。当您的旧学校代码(例如 using var conn = new SqlConnection("connstr here") 调用 conn.Open() 时,从池中租用这些已连接的连接之一并交给您;您进行一些查询,然后关闭(或处置,关闭)连接,但实际上并没有断开数据库;它只是返回到池的连接

如前所述,EF 不会参与其中;早在 EF 发明之前就已经存在,并且默认情况下处于活动状态,除非您专门将其关闭。 EF 将像任何其他应用程序一样使用 ADO.net 连接,因此它已经被动地受益于连接池


您正在阅读的文章是关于正在汇集的一组不同的东西。通常,DbContext 是一种轻量级的短命事物,它代表了一种对数据库进行查询的设备;你应该做一个,用它做几个查询,然后扔掉。

它是为快速创建而设计的,但这并不意味着没有小的改进,如果您发现需要从系统中榨取最后一滴性能的情况,那么 EF 提供了一种方法通过为 DbContext 提供池化工具而不是重新创建它们来重置它们,从而免除典型的“扔掉它并制作另一个”路线来确保您使用的是新的 DbContext

您可能不太可能处于汇集您的上下文会产生重大影响的地方;您问的是启用 connection 池,但很可能它已经启用,因为您会知道是否将“Pooling=false”放在连接字符串中。

有关连接池的更多信息,请参阅https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2022-01-18
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多