推荐的ASP.NET Web API中DbContext的生命周期是什么?

6
考虑一个ASP.NET Web API 2应用程序,使用Entity Framework提供对几个DB表的相当简单的访问。在对象生命周期方面,以下哪种选项在服务最多并发请求方面最好?
1. 实例化一个单例DbContext供所有请求使用。 2. 为每个传入请求实例化一个DbContext。 3. 为处理传入请求的线程池中的每个线程实例化一个DbContext? 4. 其他?
跟进问题 - 如果我将要求更改为“需要使用最少的DB服务器资源”? 那么最佳选项是什么?

最佳实践是(2)。搜索这个主题,你会找到讨论。 - usr
谢谢。您是否愿意将您的评论升级为带有解释的答案? :) - urig
2个回答

2

根据对另一个问题的详细回复:

我的第一种和第三种选项完全无效。原因是DbContext不是线程安全的,多个线程访问会带来不一致的数据状态并抛出异常。即使在“每个线程”情况下,ASP.NET Web API也可能会在几个线程之间任意移动单个请求的处理。

选项2- 为每个传入请求实例化一个DbContext - 是首选方式,因为它确保一次只有一个线程可以访问DbContext。


请注意如何解释答案。在处理长时间运行的上下文时,1和3同样糟糕。但是,如果一个请求生成多个线程,则每个线程可能需要1个新上下文。但没有长时间运行的上下文。如果您每个请求仅使用1个新上下文,并且请求执行Parallel tasks,则并行线程可能会破坏主进程中保存的上下文。例如,并行搜索。我个人确保每个线程有1个短暂的上下文。因此,在原始问题中,选项2b就可以了;-) - phil soady

0

除了不支持线程安全外,DbContexts 不应该存在太长的生命周期。因此,您必须使用 2 个(甚至每个 Db 操作一个 DbContext 实例)。

如果您的“对几个 DB 表格进行相当简单的访问”确实很简单,我建议您使用 OData 和一些高级 js 客户端,例如 breeze.js。

请参阅以下网站:

  • ASP.NET Web API OData 这将数据公开为简单的 REST 服务
  • breeze.js 此库提供高级 js 功能,类似于 DbContext 提供的功能,但在浏览器端:语法类似于 LINQ,本地(浏览器)数据缓存...

您还可以直接使用 OData 服务(例如使用 jQuery AJAX 或更简单的库(datajs、JayData))消费它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接