我有一个大型图表,它在Java Servlet中处理以用于路由目的。图表有100k +节点,因此我不能为每次新呼叫重新加载它。目前,图表从我的数据库加载到RAM中并在Hashmap中引用。
当我启动servlet(创建一个新实例)时,我需要通过id在图中找到startnode。因此我使用hashmap。
一切都很好。
我的问题是,在我的路由任务中,我需要更改图表中的某些属性,即行进距离。当然,这些属性对于每个创建的实例都必须是个体的。目前,我通过在创建新实例时重置所有“非静态”属性来处理该任务。 这造成了两个问题。
A)实例不是线程安全的
B)重置非常耗时。比实际路由多10倍。
所以我需要的是我的Servlet的所有实例的静态Hashmap。此Hashmap需要包含我的网络的所有节点。这些节点需要具有静态属性,如id,坐标,邻居节点等,还需要非静态属性,如行进距离。
我该怎么做?
感谢阅读和分享想法
答案 0 :(得分:1)
您的问题可以描述为在运行时构建的模型,并且每次执行服务都会实例化。
当你说“静态”时,我认为你的意思是“不变”。变量属性实际上特定于每个执行,而不是每个Servlet实例。在执行期间,您应该构建一个具有可变属性的独立结构,该结构与常量属性平行。变量结构中的每个节点引用常量结构中的单个节点。随着对每个节点的需求的出现,可变结构逐渐地按需构建。结构在执行结束时被丢弃。
答案 1 :(得分:0)
我建议以单例方式将“主图”保存在RAM中 - 正如Marko Topolnik建议的那样,但是我会保留每个会话中只更改节点的Map,没有层次结构,只需存储它们ID(如果适用,本身)