加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – asp.net mvc 4 – 好的是每个线程共享DbContext

发布时间:2020-12-16 06:32:59 所属栏目:asp.Net 来源:网络整理
导读:从 One DbContext per web request… why?起 我的理解是不应该在并发Web请求之间共享DbContext实例,所以绝对不能跨线程. 但是如何在非并发Web请求中共享它呢? 由于线程敏捷性(What is the meaning of thread-agility in ASP.Net?),我是否正确,一个线程可以
从 One DbContext per web request… why?起

我的理解是不应该在并发Web请求之间共享DbContext实例,所以绝对不能跨线程.
但是如何在非并发Web请求中共享它呢?

由于线程敏捷性(What is the meaning of thread-agility in ASP.Net?),我是否正确,一个线程可以在它死之前处理多个Web请求?

如果是这样,依赖为每个线程注入DbContext实例是否安全?

原因是我使用的是Unity,它不包括每个请求的生命周期选项.
从MVC,EF – DataContext singleton instance Per-Web-Request in Unity开始,我想我可以使用自定义的LifetimeManager;我只是想知道使用PerThreadLifetimeManager是否安全和充足.

解决方法

is it safe to dependency inject a DbContext instance for each thread?

这取决于.如果您的想法是每个Web请求都有一个DbContext,并且应用程序的一致性取决于它,那么每个线程有一个DbContext是个坏主意,因为单个Web请求仍然可以获得多个DbContext实例.并且由于ASP.NET池线程,每个线程缓存的实例将在整个应用程序的持续时间内存活,这对于DbContext来说非常糟糕(如here所述).

另一方面,您可能能够提出一个缓存方案,确保将单个DbContext用于单个Web请求,并在请求完成时返回到池,以便其他Web请求可以将其提取.这基本上是.NET中连接池的工作方式.但是由于DbContext实例缓存数据,这些数据会很快变得陈旧,所以即使你能够提出一个线程安全的解决方案,你的系统仍然会以不一致的方式运行,因为在一些看似随机的时刻,会显示旧数据对于用户,在后续请求中显示新数据.

我认为可以在Web请求开始时清除DbContext的缓存,但这基本上与为该请求创建新的DbContext相同,但性能要低得多.

I’m just wondering if it is safe and sufficient to use PerThreadLifetimeManager.

不,由于上述原因,它不安全.

但实际上很容易在每个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;
}));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读