asp.net-mvc – asp.net mvc 4 – 好的是每个线程共享DbContext
从
One DbContext per web request… why?起
我的理解是不应该在并发Web请求之间共享DbContext实例,所以绝对不能跨线程. 由于线程敏捷性(What is the meaning of thread-agility in ASP.Net?),我是否正确,一个线程可以在它死之前处理多个Web请求? 如果是这样,依赖为每个线程注入DbContext实例是否安全? 原因是我使用的是Unity,它不包括每个请求的生命周期选项. 解决方法
这取决于.如果您的想法是每个Web请求都有一个DbContext,并且应用程序的一致性取决于它,那么每个线程有一个DbContext是个坏主意,因为单个Web请求仍然可以获得多个DbContext实例.并且由于ASP.NET池线程,每个线程缓存的实例将在整个应用程序的持续时间内存活,这对于DbContext来说非常糟糕(如here所述). 另一方面,您可能能够提出一个缓存方案,确保将单个DbContext用于单个Web请求,并在请求完成时返回到池,以便其他Web请求可以将其提取.这基本上是.NET中连接池的工作方式.但是由于DbContext实例缓存数据,这些数据会很快变得陈旧,所以即使你能够提出一个线程安全的解决方案,你的系统仍然会以不一致的方式运行,因为在一些看似随机的时刻,会显示旧数据对于用户,在后续请求中显示新数据. 我认为可以在Web请求开始时清除DbContext的缓存,但这基本上与为该请求创建新的DbContext相同,但性能要低得多.
不,由于上述原因,它不安全. 但实际上很容易在每个Web请求的基础上注册DbContext: container.Register<MyApplicationEntities>(new InjectionFactory(c => { var context = (MyApplicationEntities)HttpContext.Current.Items["__dbcontext"]; if (context == null) { context = new MyApplicationEntities(); HttpContext.Current.Items["__dbcontext"] = context; } return context; })); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何提供不会被Hotmail删除的跟踪图像?
- asp.net-mvc – 使用cshtml页面的angularjs不是带有web api
- asp.net – 从ASPX中的URL检索GET变量
- asp.net core 实现支持多语言
- ASP.NET 5(MVC6)EF7外键可能会导致循环
- asp.net – 从页面代码中访问代码隐藏变量
- 在ASP.NET中使用回发??的jQuery模态对话框
- 为什么私有事件处理程序在ASP.NET中不起作用
- asp.net-mvc-3 – 如何使用ASP.Net MVC3隐藏webgrid中隐藏字
- asp.net – 如何查看Chrome开发者工具中发布到表单的数据大
- asp.net – 获取特定的会员提供商
- asp.net – 如何从包含UserControls的Repeater获
- “经典”ASP.NET页面和Microsoft MVC可以在同一个
- asp.net – jQuery AJAX在Firefox中速度慢,在IE中
- asp.net-mvc-3 – 动态加载部分视图
- asp.net-mvc-3 – Firefox页面没有正确重定向
- asp.net-mvc – 已经处理了DbContext和autofac
- asp.net-mvc – 运行测试项目时自动启动ASP.MVC项
- asp.net – 在自托管Web应用程序中使用性能计数器
- asp.net – w3wp.exe占用多少内存