[英]ThreadLocal (and Singleton) in EJB Container
我已經編寫了一個授權系統,該系統依賴於代表當前用戶的對象。 為了簡化編程並提高性能,我想在用戶登錄后將這些對象保存在ThreadLocal中。
看起來像這樣:
public class UserCache {
private static final ThreadLocal<User> cache = new ThreadLocal<User>();
public User getCurrentUser() {
return cache.get();
}
public void setCurrentUser(User user) {
cache.set(user);
}
}
我讀過靜態元素使聚類成為問題。 如果我在每個群集節點上都有一個UserCache,則它們都有自己的緩存對象,這些對象與其他節點上的緩存對象不同步。 對? UserCache
是單例的經典候選人,因為應用程序僅需要一個實例。 但是據我所知,@ Singleton EJB在群集中具有相同的行為。
那么如何使UserCache在EJB 3.1(Java EE 6)環境中可集群化呢?
從答案中提取的解決方案:
既然您已經在使用Java EE 6,那么使用CDI(上下文和依賴注入)會不會容易得多。 這將允許將用戶信息放入會話范圍 ,並輕松地將其注入到任何地方。 CDI為您管理其余部分。
那應該不會給您帶來問題,因為線程無論如何都不會跨越不同的節點-還是我錯過了您的問題的重點?
編輯:您可能想研究類似兵馬俑的東西-http: //www.terracotta.org/-了解如何將現有對象聚類
如果您需要在節點之間共享對象,我還建議您查看現有框架(例如Terracotta)。
另外,使用ThreadLocal可能會導致其他問題:
http://forums.sun.com/thread.jspa?threadID=589744 http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html http://www.theserverside.com/discussions/thread。 tss?thread_id = 21055
不過,這可能不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.