Java Servlet->;具有非静态属性的Hashmap中的静态图
我有一个很大的图,它是在一个Javaservlet中处理的,用于路由目的。该图有100k+个节点,因此我无法为每个新呼叫重新加载它。此时,图形从我的数据库加载一次到RAM中,并在Hashmap中引用 当我启动servlet(创建一个新实例)时,我需要通过id在图中找到startnode。因此我使用hashmap 这一切都很好 我的问题是,在我的路线任务中,我需要更改图表中的某些属性,即行驶距离。当然,对于每个创建的实例,这些属性都必须是单独的。目前,我通过在创建新实例时重置所有“非静态”属性来处理该任务。 这造成了两个问题 A) 这些实例不是线程安全的 B) 重置非常耗时。高达实际路由的10倍 因此,我需要的是Servlet所有实例的静态Hashmap。此Hashmap需要包含网络的所有节点。这些节点需要具有静态属性,如id、坐标、相邻节点等,但也需要具有非静态属性,如行驶距离 我该怎么做Java Servlet->;具有非静态属性的Hashmap中的静态图,java,servlets,graph,static,routing,Java,Servlets,Graph,Static,Routing,我有一个很大的图,它是在一个Javaservlet中处理的,用于路由目的。该图有100k+个节点,因此我无法为每个新呼叫重新加载它。此时,图形从我的数据库加载一次到RAM中,并在Hashmap中引用 当我启动servlet(创建一个新实例)时,我需要通过id在图中找到startnode。因此我使用hashmap 这一切都很好 我的问题是,在我的路线任务中,我需要更改图表中的某些属性,即行驶距离。当然,对于每个创建的实例,这些属性都必须是单独的。目前,我通过在创建新实例时重置所有“非静态”属性来处
感谢阅读和分享您的想法您的问题可以描述为在运行时构建的模型,并在每次执行服务时实例化 当你说“静态”时,我想你的意思是“恒定”。变量属性实际上特定于每个执行,而不是每个Servlet实例。在执行过程中,您应该构建一个单独的结构,其中包含与常量属性并行的变量属性。变量结构中的每个节点引用常量结构中的单个节点。随着对每个节点的需求的增加,可变结构会逐渐根据需要构建。该结构在执行结束时被丢弃。我建议以单例方式将“主图”保存在RAM中——正如Marko Topolnik建议的那样,但我只保留每个会话中更改的节点的映射,而不保留层次结构,只按ID存储它们(如果适用,本身)
- 当会话结束时,您只需放弃会话中的映射,仅此而已
- 当新会话开始时,只需创建一个新的映射实例李>
- 如果这很关键的话,您也可以将这些映射合并在一起,但要避免过早的优化,因为这会导致比避免的问题多得多的问题
- 如果需要访问某个节点,请从原始映射中获取该节点,然后在“会话本地”映射中查找该节点,如果找到,则合并两个节点中的数据。(或者,如果您在“会话本地”映射中存储完整节点,而不仅仅是更改的atributes,请使用该映射中更改的节点)
- 另外,要小心,这有很多地方可能会导致内存泄漏
ThreadLocal
变量,该变量指向变量结构。不过,我很确定,您可以(而且可能应该)重构,以便所有代码都驻留在变量结构中,而固定结构不需要知道它。