ASP.NET WebAPI 2 +实体框架连接缓存的最佳实践

时间:2017-02-28 19:15:35

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

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

现在我正在为每个请求创建一个新连接:在每个控制器中都有一个对象被实例化并为每个方法处理。

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自己进行的缓存。

1 个答案:

答案 0 :(得分:11)

我认为您误解了实体框架的工作原理。

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

EF也在内部使用一些模式,如工作单元,因此它意味着封装一组操作(因此名称中的“上下文”一词)。这就是为什么你有一个SaveChanges()方法将所有东西“提交”到数据库。

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

然而,您可以做的只是在需要时创建实例,而不是让控制器在每次请求时创建实例。再说一次,如果您使用的是Web API,那么几乎总是需要访问数据......