我在我的网络应用程序中为数据上下文使用单例模式,这样我就不必每次都实例化它,但是我不确定网络应用程序是如何工作的,IIS 是否为每个连接的用户打开一个线程?如果是这样,如果我的单例不是线程安全的,会发生什么?另外,可以为数据上下文使用单例模式吗?谢谢。
最佳答案
I'm using a singleton pattern for the datacontext in my web application
在这种情况下,“单例”可能意味着许多不同的事情。它是每个请求的单个实例吗?每节课?每个线程?每个 AppDomain(static
实例)?所有这些的含义截然不同。
每个请求一个“单例”(存储在 HttpContext
中)就可以了。不鼓励每个 session 一个单例,但可以使它工作。每个线程的单例可能看起来有效,但可能会导致意外且难以调试的行为。每个应用程序或 AppDomain 的单例是一场等待发生的灾难。
so that I dont have to instantiate it every time
创建一个 DataContext
非常非常便宜。元数据是全局缓存的,在您实际执行查询之前不会创建连接。没有理由尝试优化 DataContext
实例的构造。
however I'm not sure how web applications work, does IIS open a thread for every user connected?
IIS对每个请求使用不同的线程,但是单个请求可能使用多个线程,而线程是从线程池中取出的,这意味着最终同一个用户会在多个不同的线程上有请求,反之,不同的用户将在多个请求和很长一段时间内共享同一个线程。这就是为什么我在上面提到你不能依赖线程本地单例。
if so, what would happend if my singleton is not thread safe?
非常糟糕的事情。您在 ASP.NET 应用程序中全局缓存的任何内容要么需要线程安全,要么需要在使用时锁定。
Also, is it OK to use a singleton pattern for the datacontext? Thanks.
DataContext
不是线程安全的,在这种情况下,即使您在 DataContext
正在使用时锁定它(这已经是一个糟糕的主意),您仍然会遇到跨线程/跨请求竞争条件。不要这样做。
DataContext
实例应尽可能限制在单个方法的范围内,使用 using
子句。下一个最好的办法是将它们存储在 HttpContext
中。如果必须的话,你可以在 Session 中存储一个,但是有很多事情你需要注意(参见 this question 我最近在 ObjectContext
上回答 - 几乎所有相同的原则都适用于一个 DataContext
)。
但最重要的是,不要在 ASP.NET 应用程序中创建 DataContext
的“全局”单例实例。以后你会深深后悔的。
关于c# - Web 应用程序中的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398297/