gpt4 book ai didi

asp.net-mvc - asp.net mvc 4 - 可以为每个线程共享 DbContext 吗?

转载 作者:行者123 更新时间:2023-12-04 23:52:52 26 4
gpt4 key购买 nike

来自 One DbContext per web request... why?

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

由于线程敏捷性( What is the meaning of thread-agility in ASP.Net? ),我认为一个线程在死亡之前可以处理多个 Web 请求是对的吗?

如果是这样,为每个线程依赖注入(inject)一个 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?



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

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

我认为可以清除 DbContext的缓存在 Web 请求的开头,但这与创建新的 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;
}));

关于asp.net-mvc - asp.net mvc 4 - 可以为每个线程共享 DbContext 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19722623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com