嗨,您如何看待这个问题?HttpSession
中确实包含太多信息,因为最终计算出了很多信息,并且最终需要在请求之间存储一些大对象图。
使用诸如memcache之类的任何缓存是否合适?还是等于为JVM增加内存?
担心在两次请求之间将其存储在数据库中。如果我们得到,你会用什么
内存不足错误?
谢谢。
最佳答案
我认为的重点是数据的寿命。
考虑一下HttpSession的以下两个特征:
如果您有集群需求,则数据库会处理它。但是请注意,那时您不能在内存中缓存任何内容。
在数据库中存储的使用寿命更长((在会话之间,甚至在重新引导之间持续存在!),因此,这个问题甚至值得(除非您将内存问题换成性能问题)。
我认为这对于预期寿命不会持久的数据来说是错误的方法...
暂态数据
如果数据仅对一个请求有用,则通常将其存储在HttpRequest中。
但是,如果将它用于几个请求(在一个屏幕内,或者在屏幕序列之内,例如助手..的交互),则HttpRequest太短而无法存储,但是HttpSession太长。数据需要定期清理。
和HttpSession中的许多内存问题都与此类数据相关,这些数据是暂时的但并未清除(完全忘记,或者在发生异常或用户不遵守常规流程时未清除:打
Back
,使用a上一个书签,其他菜单上的clic或其他名称)。缓存库具有正确的寿命
为完全避免这种清理工作(并避免出现问题时发生OutOfMemory的风险),可以将信息存储在具有正确使用寿命的数据结构中。由于容器不提供此功能(无论如何它都与应用程序相关),因此您需要自己使用缓存库(如所述的;我们使用EhCache)来实现此目的。
这个想法是,您拥有一个技术代码(与一个功能页面无关,但是在全局范围内实现,例如使用ServletFilter ...),以确保在不再需要对象之后始终进行清理。
您可以使用以下一种或多种策略来设计此缓存,以清除缓存。每个与功能寿命相关的策略:
实现思路:每个请求都必须带有其screenId,负责清除缓存的技术代码会检测到当前HttpSession ID的当前screenId与缓存中的那个不匹配的时间。然后,它清除或重置缓存中的该项目。
实现:与以前相同,每个请求都必须带有模块ID ...
实现:缓存库本身支持此限制因素,还有更多...
注意:每个缓存可以是应用程序范围的,也可以是特定于用户的,HttpSession ID,Company ID或其他功能值...