我试图找出使用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自己进行的缓存。
答案 0 :(得分:11)
我认为您误解了实体框架的工作原理。
EF使用ADO.NET,因此连接池实际上由提供商管理。您可以通过连接字符串更改池的行为。我相信它默认重用连接。
EF也在内部使用一些模式,如工作单元,因此它意味着封装一组操作(因此名称中的“上下文”一词)。这就是为什么你有一个SaveChanges()方法将所有东西“提交”到数据库。
因此,实际上建议您为每个请求创建一个新实例,以保证“工作单元”的完整性,即使这样,您也应确保以转换为的方式保存更改数据库方面的原子事务。
然而,您可以做的只是在需要时创建实例,而不是让控制器在每次请求时创建实例。再说一次,如果您使用的是Web API,那么几乎总是需要访问数据......