2017-02-28 128 views
2

我试图找出在我的平台上使用WebAPI和实体框架执行操作的最佳方式。ASP.NET WebAPI 2 +实体框架连接缓存的最佳实践

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

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

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

在我看来,为每个请求创建连接是一个影响性能的完整开销。我知道在Java上有一些工具(Nutcracker可能?)处理一种连接池以重用相同的连接,并通过这种方式提高性能。

在c#/ ASP.NET/Azure平台中是否有类似的东西?

我真的很感谢在请求数量上的性能比较。

编辑:这主要是指DbContext自己做的缓存。

+2

创建新的DbContext不会打开任何数据库连接 – ErikEJ

回答

5

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

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

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

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

但是,您可以做什么,只需在需要时创建实例,而不是让控制器在每个请求上创建实例。再次,如果您使用Web API机会,您几乎总是需要访问数据...