2015-02-09 48 views
0

我一直在使用我的EE应用程序出现问题,我相信我发现了根本原因 - 静态对象在tomcat webapp的所有会话中都可用,并且不会死亡。因此,我需要调整我的代码,以便每个会话都有独特的对象。在Java EE中使用静态对象

我有几个类扩展搜索。 搜索目前拥有

public static Parser parse; 

的领域,我经历是指它从我的代码。

我的其他许多扩展搜索的类都创建了50次左右,每当需要使用解析器对象时,我都会简单地调用super.getParse()。我想避免制作一个新的,因为这是一个缓慢的过程。

什么是正确的方式来创建一个单一的解析器对象,并绕过我的代码而不是静态的?

真的很感谢任何建议或指导。

+0

代码吗?什么是静态对象? – drgPP 2015-02-09 09:56:25

+0

在我上面的问题中,你可以看到解析器是静态的。我希望以设计模式的形式获得更多答案,而不是直接更正我的代码。我相信很多人不得不解决同样的问题,并且正在寻找如何:) – 2015-02-09 09:58:21

回答

0

如果您确实需要唯一对象或使用线程局部变量,请使用同步访问器。

请注意,如果所有查询都需要访问该唯一对象,则使用同步访问器可能会减少应用程序的吞吐量。在这种情况下,一个线程局部变量(即不那么唯一,但是唯一的会话范围)将是更好的解决方案。

http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

+0

这听起来像它可以实现我想要的,但是这个例子很抽象,离我的用例很远。你可以吗?可能将我链接到任何用于为每个线程创建对象的示例?我真的很感激它。 – 2015-02-09 11:37:26

+1

经过一番玩,我得到了这个工作。多么伟大的工具。谢谢! – 2015-02-09 12:15:52

0

您正在寻找Singleton模式,你可以找到参考这里

+0

我不会遇到与单身变量相同的问题吗?当你维护对实例的静态引用时,tomcat webapps永远不会“死”,难道我不会遇到完全相同的问题吗? – 2015-02-09 10:05:43

+0

但是如果你永远不想改变你的解析器对象,那么这种方法不是问题,单例类永远不会改变(例如打印机,假脱机程序) – Vihar 2015-02-09 10:13:12

+0

我需要根据我的文章对每个新会话进行更改。 – 2015-02-09 10:15:24

1

这里做什么:

  • 去除静电从你的对象

  • 把对象在用户会话

这样每个用户都在他自己的会话

对象看,这可能有助于 HttpSession - how to get the session.setAttribute?

+0

请你能提供一些额外的信息如何实现这一目标? – 2015-02-09 10:18:04

+0

我已编辑我的答案,您可以通过接受它作为正确的答案感谢:) – 2015-02-09 10:23:09

+0

我仍然不知道我将如何使用它来创建每个会话的解析器抱歉。如果你能以更具体的答案帮助我,我会很乐意接受这个答案(因为它听起来似乎是正确的。 – 2015-02-09 11:34:46