gpt4 book ai didi

java - HttpSession中的信息过多

转载 作者:搜寻专家 更新时间:2023-11-01 01:39:02 25 4
gpt4 key购买 nike

嗨,您如何看待这个问题?
HttpSession中确实包含太多信息,因为最终计算出了很多信息,并且最终需要在请求之间存储一些大对象图。

使用诸如memcache之类的任何缓存是否合适?还是等于为JVM增加内存?

担心在两次请求之间将其存储在数据库中。如果我们得到,你会用什么
内存不足错误?

谢谢。

最佳答案

我认为的重点是数据的寿命。

考虑一下HttpSession的以下两个特征:

  • 群集中时,该容器负责复制Httpt的。这很好(您不必自己进行管理),但是如果这会导致过多的交换,则在性能方面可能会很危险...如果您的应用程序未集群,请忽略这一点。
  • HttpSession的寿命可以是几分钟或几小时,即用户保持 Activity 状态。对于具有该寿命的信息(连接信息,首选项,授权...),这是完美的选择。但这不适用于从一个屏幕到下一屏幕有用的数据,我们称其为瞬态+数据。

  • 如果您有集群需求,则数据库会处理它。但是请注意,那时您不能在内存中缓存任何内容。
    在数据库中存储的使用寿命更长((在会话之间,甚至在重新引导之间持续存在!),因此,这个问题甚至值得(除非您将内存问题换成性能问题)。
    我认为这对于预期寿命不会持久的数据来说是错误的方法...

    暂态数据
    如果数据仅对一个请求有用,则通常将其存储在HttpRequest中。
    但是,如果将它用于几个请求(在一个屏幕内,或者在屏幕序列之内,例如助手..的交互),则HttpRequest太短而无法存储,但是HttpSession太长。数据需要定期清理。
    和HttpSession中的许多内存问题都与此类数据相关,这些数据是暂时的但并未清除(完全忘记,或者在发生异常或用户不遵守常规流程时未清除:打 Back,使用a上一个书签,其他菜单上的clic或其他名称)。
    缓存库具有正确的寿命
    为完全避免这种清理工作(并避免出现问题时发生OutOfMemory的风险),可以将信息存储在具有正确使用寿命的数据结构中。由于容器不提供此功能(无论如何它都与应用程序相关),因此您需要自己使用缓存库(如所述的;我们使用EhCache)来实现此目的。
    这个想法是,您拥有一个技术代码(与一个功能页面无关,但是在全局范围内实现,例如使用ServletFilter ...),以确保在不再需要对象之后始终进行清理。
    您可以使用以下一种或多种策略来设计此缓存,以清除缓存。每个与功能寿命相关的策略:
  • 用于仅与一个屏幕相关的数据(但有几个请求:重新加载屏幕,Ajax请求...),高速缓存一次只能存储一个屏幕的数据(对于每个会话),将其称为“currentScreenCache”。这保证了,如果用户转到另一个屏幕(即使以非托管方式),则新屏幕将覆盖“currentScreenCache”信息,并且可以对先前的信息进行垃圾收集。

  • 实现思路:每个请求都必须带有其screenId,负责清除缓存的技术代码会检测到当前HttpSession ID的当前screenId与缓存中的那个不匹配的时间。然后,它清除或重置缓存中的该项目。
  • 用于仅在一系列连接的屏幕(称为功能模块)中使用的数据,在模块级别也是如此。

  • 实现:与以前相同,每个请求都必须带有模块ID ...
  • 用于需要重新计算的昂贵数据,可以将缓存库配置为存储最后X个计算出的值(在不久的将来,不太可能使用前一个值)。在典型用法中,经常会要求使用相同的请求,因此您有很多缓存命中。大量使用时,达到X限制并且内存不会膨胀,从而防止OutOfMemory错误(以下次重新计算为代价)。

  • 实现:缓存库本身支持此限制因素,还有更多...
  • 用于仅在几分钟内有效的数据,可以将缓存库本地配置为在该延迟后将其丢弃...
  • ...更多信息,请参阅缓存库配置以获取其他想法。

  • 注意:每个缓存可以是应用程序范围的,也可以是特定于用户的,HttpSession ID,Company ID或其他功能值...

    关于java - HttpSession中的信息过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145945/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com