C# ASP.NET WebAPI 2+;连接缓存的实体框架最佳实践
我正试图找出在我的平台上使用WebAPI和实体框架执行操作的最佳方法 现在,我在每个请求中创建一个新的连接:在每个控制器中,都有一个对象被实例化,并为每个方法(如)释放C# ASP.NET WebAPI 2+;连接缓存的实体框架最佳实践,c#,asp.net,entity-framework,azure,asp.net-web-api,C#,Asp.net,Entity Framework,Azure,Asp.net Web Api,我正试图找出在我的平台上使用WebAPI和实体框架执行操作的最佳方法 现在,我在每个请求中创建一个新的连接:在每个控制器中,都有一个对象被实例化,并为每个方法(如)释放 public class SchedulerController : ApiController { private ApplicationDbContext db = new ApplicationDbContext(); protected override void Dispose(bool dispos
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自己进行的缓存 我认为您误解了实体框架的工作原理 EF在幕后使用ADO.NET,因此连接池实际上由提供者管理。您可以通过连接字符串更改池的行为。我相信默认情况下它会重用连接 EF在内部也使用了一些模式,比如工作单元,所以它的意思是封装一组操作(因此名称中有“context”一词)。这就是为什么您有一个SaveChanges()方法将所有内容“提交”到数据库 因此,实际上建议您为每个请求创建一个新实例,以保证“工作单元”的完整性,即使如此,您也应该确保以某种方式保存更改,以转换为数据库端的原子事务
但是,您可以做的是只在需要时创建实例,而不是让控制器在每次请求时创建实例。同样,如果您使用的是Web API,那么您几乎总是需要访问数据,因此…创建新的DbContext不会打开任何数据库连接