c# - ASP.NET WebAPI 2 + Entity Framework 连接缓存最佳实践

标签 c# asp.net entity-framework azure asp.net-web-api

我正在尝试找出使用 WebAPI 和 Entity Framework 在我的平台上执行操作的最佳方法。

现在,我正在根据每个请求创建一个新连接:在每个 Controller 中,都有一个实例化的对象,并为每个方法进行处置,例如。

public class SchedulerController : ApiController
{
    private ApplicationDbContext db = new ApplicationDbContext();

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            db.Dispose();
        base.Dispose(disposing);
    }
}

在我看来,为每个请求创建连接是一个影响性能的完整开销。我知道 Java 上有一些工具(也许是胡桃夹子?)​​可以处理某种连接池以重用相同的连接,从而提高性能。

C#/ASP.NET/Azure 平台中有类似的东西吗?

我也非常感谢对不断增长的请求数量进行性能比较。

编辑:这主要是指DbContext本身进行的缓存。

最佳答案

我认为您误解了 Entity Framework 的工作原理。

EF 在幕后使用 ADO.NET,因此连接池实际上由提供程序管理。您可以通过连接字符串更改池的行为。我相信它默认会重用连接。

EF 还在内部使用了一些模式,例如工作单元,因此它旨在封装一组操作(因此名称中包含“上下文”一词)。这就是为什么您有一个 SaveChanges() 方法将所有内容“提交”到数据库。

因此,实际上建议您为每个请求创建一个新实例,以保证“工作单元”的完整性,即使如此,您也应该确保以可转换为的方式保存更改数据库端的原子事务。

但是,您可以做的是仅在需要时创建实例,而不是让 Controller 根据每个请求创建实例。话又说回来,如果您使用 Web API,您几乎总是需要访问数据,因此...

关于c# - ASP.NET WebAPI 2 + Entity Framework 连接缓存最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516981/

相关文章:

c# - JSON空字符串为null

c# - 如何在 MVC.Net 中为无尽类别树编写 Foreach 循环?

c# - Gridview 中的 TextBox 返回 null 或 'System.Web.UI.WebControls.TextBox'

Entity Framework 迁移脚本中的 MySql 存储过程/循环

NHibernate 与 Entity Framework 4.1 中的数据库支持

c# - button.click 事件发生时如何获取按钮名称/标签?

c# - 这部分代码叫什么?

c# - 覆盖然后设置为空

c# - 解码/解密期间 Base-64 字符数组的长度无效

c# - 如何在 Entity Framework 中设置两个一对多关系?