2010-04-09 41 views
3

我寫了一個授權系統,它依賴於表示當前用戶的對象。爲了簡化編程並提高性能我想擁有這些對象在一個ThreadLocal的用戶登錄後EJB容器中的ThreadLocal(和Singleton)

它看起來是這樣的:

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在集羣中具有相同的行爲。

那麼在EJB 3.1(Java EE 6)環境中如何使UserCache可集羣化?

解決方案從答案中提取:

  • 從CDI使用SessionScope(JSR 299)或
  • 使用JVM集羣與兵馬俑

回答

5

既然你已經對Java EE 6的方式,是不是即使是一個更容易使用CDI(上下文和依賴注入)。這將允許將用戶信息放入session scope,並在任何地方輕鬆注入。 CDI爲你管理剩下的部分。

1

,不應該使你一個問題,因爲線程無論如何都不跨越不同的節點 - 或者我錯過了你的問題點?

編輯:你可能想看看像兵馬俑 - http://www.terracotta.org/ - 你可以羣集現有對象

+0

你說得對,我在本地線程的方法在集羣中沒有多大意義。因此,我必須使用兵馬俑或CDI SessionScope,就像chris_l建議的一樣。 – deamon 2010-04-09 12:04:58