2015-02-09 82 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