2012-09-24 54 views
0

我正在使用现有的基于Web的应用程序,该应用程序使用静态地图存储特定于应用程序的数据。Java:使用静态变量将应用程序规格数据存储在基于Web的应用程序内

这是我的代码低于它负责存储数据的内部ConcurrentHashMap如下所示。

public class MyClass 

    // Class variable 
    private static Map<String, UserThread> usermap = new ConcurrentHashMap<String, UserThread>(); 

// Inside a Method 
public void userData() 
{ 
UserThread userThread= usermap.get(getLoginId()); 
if (userThread == null) { 
userThread = new UserThread(); 
userThread.start(); 
usermap.put(getLoginId(), userThread); 
} 
} 

应用程序工作正常,在这里我的问题是,这是一个有效的代码,因为我们可以存储静态变量中的数据? (此处的静态ConcurrentHashMap包含特定于应用程序数据)

+0

我不是说这是最好的主意,但为什么你不能?你怕什么呢?你有没有想过将它存储在一个servlet上下文属性呢? –

+0

你是什么意思“但你为什么不能”? – Pawan

+0

你问你是否可以做到上述,尽管你已经做到了,而且工作正常。那么,为什么你关心这个代码呢?为什么你担心这可能不是一个好主意? –

回答

1

使用静态地图,除非您确定添加到地图中的每个条目的生命周期,例如谁将添加它们,条目将保留在那里以及何时将保留在内存中他们被删除,以便他们可以在GC期间声称。否则,你的应用程序将用完内存并开始抛出OOME。应避免

+0

感谢Vikdor,根据代码,当用户注销或关闭浏览器时,该条目将从Map中删除。所以我猜这是没有问题的。 – Pawan

+0

当活动会话的用户数量多于应用程序可容纳的数量时,这是一个问题。这就是配置适当大小和驱逐策略以配合使用缓存的原因,以便您知道在任何时间点最多可容纳多少数据。 – Vikdor

0

在这种情况下,用户将登录在一个机器上将具有相同的会话与第二机器上。我敢打赌这不是一个好的方法。

我前一段时间询问过Semi static field in Java application,Alessandro Santini给了我很好的解决方案ThreadLocal。看一下这个。

+1

ThreadLocal在这里不会帮助... –

2

静态变量和任何形式的缓存,尤其是在多线程环境,如Web的应用程序。您的代码有几个问题:

  1. 您是否从地图中删除UserThreads?你怎么知道他们什么时候应该被删除?如果客户的浏览器崩溃怎么办?如果你不删除它们,你会在应用程序运行一段时间后要求出现内存不足错误。
  2. 在你使用它不是线程安全的方式使用ConcurrentHashMap的,因为它有可能是另一个线程增加if (userThread == null)usermap.put(getLoginId(), userThread);之间的UserThread。 HashMap的Concurent版本并没有神奇般地解决所有线程安全问题。
  3. 在servlet容器中产生自己的线程不是一个好主意。有更好的方法来完成后台任务,但首先你需要说明线程想要做什么。

在任何类型的应用程序中,通常使用任何类型的这种静态缓存都是坏主意。在你的情况下,在用户会话中保存特定于应用程序的数据会更好。

0
  1. AFAIK它是根据规范不好在容器内启动你自己的线程。你应该为此使用WorkManager。但是我知道的唯一的服务器实际上是强制执行该规则的是Websphere Application Server。

  2. 原则上一个静态变量就可以了,当然,如果你在一个集群环境中的每个服务器都会有自己的静态变量的情况下运行。这可能也可能不是问题。

所以技术上你可能会没事。

在另一方面,我真的很好奇,你正在努力实现所有这些线程什么。如果你为每个用户启动一个线程,这对于DOS攻击来说是一个很好的攻击媒介。我也不知道你为什么想要这样做。

+0

我很担心这一点“每个服务器都有自己的静态变量实例”我们的应用程序在使用5台Web服务器的集群环境中运行,但从来没有任何问题 – Pawan

+0

这可能是由于您的负载的配置平衡器。如果它实现了“粘性会话”,那么你很好,但如果这种情况发生变化,或者其中一台服务器实际上失败了...... –

相关问题