使用2个Web服务器,单例类是否有2个实例?
答案 0 :(得分:18)
两个Web服务器都将具有其应用程序进程的单独实例,无论是.net还是java。所以是,两个服务器都将拥有单个类的单独实例。
无论这两个Web服务器是两个不同的物理机,即使它们位于同一台服务器上,它们肯定会完全在不同的进程上运行。每个进程都会将其对象与其他任何进程分开加载到内存中。
specifically in case of asp.net
-
即使在单个Web服务器中,每个站点也会导致Singleton类的单独实例。因为asp.net工作进程中的每个站点都加载在单独的应用程序域中,所以没有两个域可以干扰彼此的对象。因此,在asp.net的情况下,即使具有单个asp.net工作进程的单个Web服务器也可以/将具有单个类的多个实例,每个实例与另一个实例分开。
答案 1 :(得分:9)
是的,每个JVM甚至是类加载器都有一个Singleton。
请参阅此When is a Singleton not a Singleton?文章(适用于Java)。
答案 2 :(得分:0)
“2个Web服务器”是什么意思? 静态字段(单例)的范围是应用程序域(在.net中)。
因此,如果您的两个Web服务器在两个单独的应用程序域中运行,则为是,否则为否。
答案 3 :(得分:0)
事实上,如果部署了两次部署的webapp,你可能在一个Web服务器中有2个单例调用实例。
在Java中,类加载器是类的标识的一部分。您可以使用不同的类加载器两次加载相同的类,并且所有静态字段将存在两次。 C#有类似的机制。
答案 4 :(得分:0)
可以创建一个将在所有内容上复用的Web服务器 - 连接,侦听套接字,甚至接口。它仍然是该类的一个实例,只有一个线程,并且除此之外还有相当小的内存占用。需要注意的是,从大多数实际角度来看,它看起来像两台服务器,它仍然只有一台服务器(如果它崩溃了,它会崩溃整个......)
这种方法并不像多线程Web服务器那样受欢迎,因为虽然硬件更轻,但开发人员更难处理 - 您必须在所有内容之间进行显式多路复用,并在非阻塞调用中处理所有连接。如果你产生一些额外的线程,操作系统会从你身上带走很多工作,让你更容易编写功能更丰富的服务器。
当然,即使在单线程服务器中,在单独的任务中产生第二台服务器仍然是可能的,只有用户/ admin /谁再次执行二进制文件,具有不同的配置。这需要一些非常精美的编程来防止这种情况发生。
答案 5 :(得分:0)
这就是JSP / Servlets提供“会话”和“应用程序”数据的想法的原因。这些应该在多服务器环境中的服务器之间共享。
答案 6 :(得分:-1)
作为此问题的扩展,特别是对于.NET Web应用程序,您还需要注意SessionState处理。假设会话不是“粘性”(一旦建立会话,用户就停留在一个Web服务器上),您需要将SessionState更改为进程外。这可以是ASP.NET会话状态服务器,也可以是SQL Server,但要记住的关键点是SessionState不会在服务器之间自动共享,除非您通过进程外共享它。此外,您在SessionState中放置的任何内容都需要可序列化;将[Serializable]属性添加到您在SessionState中使用的任何类。