我们应该使用什么技术来使httpsession对象不会严重加载数据。
示例:
请求1 ----> httpSession加载了50,000个不同对象的arraylist。 session.setAttribute( “数据”,数组列表);
请求2 ----> httpSession加载了40,000个不同对象的arraylist。 session.setAttribute( “数据”,数组列表);
假设服务器被大量加载,其中包含多个会话和大量数据。让我们一起从上面的例子request1..1000说。这意味着1000个会话对象拥有庞大的数据。
在这样的会话中解决的替代方法是什么?
答案 0 :(得分:3)
一些想法:
更准确地选择您真正需要为客户端提供哪些数据,而不是在第一次请求时对Session中的所有内容进行处理,只能在客户端真正需要时加载数据(cq在单击选项卡时)由用户)。您还可以使用专门的轻量级类而不是完整的后端域类将数据传递给前端。
检查您的域模型,看看是否可以拆分任何“静态数据”。我的意思是指在您的应用程序中共享的数据并且不会发生很大变化,例如zipcodes。这种类型的数据非常适合缓存和通过引用传递,而不是复制它。
如上所述,使用像Ehcache这样的缓存框架。它减少了应用程序中对管道代码的需求,并允许跨所有会话进行共享缓存,而不是复制数据。当然,如果您只在会话中存储特定于用户的数据,那么共享将不会带来很大好处。像这样的框架还允许您配置缓存策略,例如,以便在必要时它将开始使用数据库。
答案 1 :(得分:2)
将其放在应用程序范围中(如果它不是特定于用户的),或者替换为基于请求的数据库端分页/过滤(如果它是特定于用户的)。
我认为数据已存储在数据库中。把它放在应用程序范围内并没有多大意义。当Java代码在Java内存中拖拽/复制数据存储区(例如RDBMS)的整个数据集,然后使用Java代码在Java内存中完成工作时,您将始终遇到内存问题。当你甚至在web应用程序的会话范围内存储/复制它时,它确实会变得更糟。
最节省内存的方法是让数据库完成发明它的任务。 SQL语言为每个ORDER BY
子句提供排序,WHERE
子句进行过滤,(DB供应商特定)LIMIT/OFFSET
子句/子选择/函数只返回基于 firstrow 和 rowcount 或 lastrow 的记录子集。这样,您最终只能 Java内存中实际要显示的数据集。
您可以在此前发布的this answer中找到所需SQL查询的示例。希望这会有所帮助。
答案 2 :(得分:1)
仅存储停留在共享池(内存,数据库,平面文件)中的对象的唯一标识符
答案 3 :(得分:0)
如果您在视图中使用数据,则可以在请求上设置属性,或使用表单。如果您需要在会话处于活动状态时获取数据,请将其放在数据库中。
答案 4 :(得分:0)