J2EE:Singleton vs将事物保持在会话中

时间:2010-09-10 16:17:35

标签: java session servlets java-ee singleton

何时应该在会话中保留一个对象(即应用程序范围的属性文件),而不是创建一个单例来保存它?应该何时使用这些方法?

注意:我正在开发集群环境,如果这有任何区别的话。

3 个答案:

答案 0 :(得分:9)

如果它应该是应用程序范围的,那么您不应该将它存储在会话范围中,而是存储在应用程序范围中。存储在会话范围中时,您不必要地为每个访问者复制相同的数据。根本不需要单例,只需在ServletContextListener的帮助下在服务器启动期间实例化一次,并使用ServletContext#setAttribute()将其存储在应用程序范围内。

答案 1 :(得分:2)

+1给BalusC,但我怀疑这只是你的错字。

至于单身人士,这取决于你对单身人士的意思。如果你有一个用@Singleton注释的EJB,那就没关系(其他依赖注入提供者也可能支持这种模式)。

如果你在谈论标准的单例模式,你将实例保存在静态变量中,那么这是一个坏主意。您通常应该避免在Java EE或servlet容器中使用静态变量,因为类加载可能有点棘手 - 当您不期望它时可能会结束多个副本,或者您可能在不同的应用程序之间共享单个副本,或者您可能在重新部署应用程序时将内容保留在内存中。如果变量未暴露在类外部,并且您并不真正关心它有多少副本(例如,记录器对象),则可以例外。

答案 2 :(得分:2)

  

注意:我正在开发集群环境,如果这有任何区别的话。

我不同意MikeBalusC已经写过的内容,但我觉得你正在进入实施细节很重要的领域。您的工作以及如何操作将取决于后端服务,何种集群以及应用程序要求。我认为问题太广泛,无法给出具体答案。

Furthermore...

  

所有Java EE配置文件都共享一组常用功能,例如命名和资源注入,打包规则,安全要求等。这保证了所有产品和间接应用程序的一致性,属于“Java EE”平台“伞。这也确保了熟悉某个配置文件或完整平台的开发人员可以轻松地移动到其他配置文件,从而避免过度划分技能和经验。

Java EE规范定义了一定程度的合规性,但目标不是使每个基础架构都异构。这种事情增加了已经模糊的问题领域的复杂性。