Java Servlet - > Hashmap中的静态图,具有非静态属性

时间:2012-11-10 09:16:06

标签: java servlets graph static routing

我有一个大型图表,它在Java Servlet中处理以用于路由目的。图表有100k +节点,因此我不能为每次新呼叫重新加载它。目前,图表从我的数据库加载到RAM中并在Hashmap中引用。

当我启动servlet(创建一个新实例)时,我需要通过id在图中找到startnode。因此我使用hashmap。

一切都很好。

我的问题是,在我的路由任务中,我需要更改图表中的某些属性,即行进距离。当然,这些属性对于每个创建的实例都必须是个体的。目前,我通过在创建新实例时重置所有“非静态”属性来处理该任务。 这造成了两个问题。

A)实例不是线程安全的

B)重置非常耗时。比实际路由多10倍。

所以我需要的是我的Servlet的所有实例的静态Hashmap。此Hashmap需要包含我的网络的所有节点。这些节点需要具有静态属性,如id,坐标,邻居节点等,还需要非静态属性,如行进距离。

我该怎么做?

感谢阅读和分享想法

2 个答案:

答案 0 :(得分:1)

您的问题可以描述为在运行时构建的模型,并且每次执行服务都会实例化

当你说“静态”时,我认为你的意思是“不变”。变量属性实际上特定于每个执行,而不是每个Servlet实例。在执行期间,您应该构建一个具有可变属性的独立结构,该结构与常量属性平行。变量结构中的每个节点引用常量结构中的单个节点。随着对每个节点的需求的出现,可变结构逐渐地按需构建。结构在执行结束时被丢弃。

答案 1 :(得分:0)

我建议以单例方式将“主图”保存在RAM中 - 正如Marko Topolnik建议的那样,但是我会保留每个会话中只更改节点的Map,没有层次结构,只需存储它们ID(如果适用,本身)

  • 会话结束时,您只需要在会话中放弃地图,就是这样。
  • 当新会话开始时,只需创建一个新的Map实例...
  • 你也可以汇集这些地图,如果这是至关重要的 - 但要避免过早的优化,因为它会导致比它避免的问题更多的问题。
  • 如果您需要访问某个节点,请从原始Map中获取它,然后查找它是否存在于“session local”映射中,然后将两者中的数据合并(如果找到)。 (或者,如果存储完整节点,而不仅仅是“会话本地”映射中更改的属性,请使用该映射中已更改的节点)
  • 另外,请注意,这有很多地方可能会引入内存泄漏......