簡體   English   中英

EJB容器中的ThreadLocal(和Singleton)

[英]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)環境中可集群化呢?

從答案中提取的解決方案:

  • 使用來自CDI(JSR 299)的SessionScope或
  • 在Terracotta中使用JVM集群

既然您已經在使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM