1

我们应该使用什么技术来使 httpsession 对象不加载大量数据。

例子 :

请求 1 ---- > httpSession 加载了一个包含 50,000 个不同对象的数组列表。session.setAttribute("数据",arraylist);

请求 2 ---- > httpSession 加载了一个包含 40,000 个不同对象的数组列表。session.setAttribute("数据",arraylist);

假设服务器负载很重,其中包含多个会话和大量数据。让我们从我上面的示例中说一次 request1..1000。这意味着 1000 个具有大量数据的会话对象。

解决它们的替代方法是什么,而不是像这样将它们存储在会话中?

4

5 回答 5

3

一些想法:

  1. 对您真正需要为您的客户提供哪些数据更具选择性,而不是在第一次请求时将所有数据都放在 Session 中,您只能在客户真正需要时加载数据(cq 当用户单击选项卡时)。您还可以使用专门的轻量级类而不是完整的后端域类将数据传递到前端。

  2. 检查您的域模型,看看您是否可以拆分出任何“静态数据”。我的意思是指通常在您的应用程序中共享并且不会发生太大变化的数据,例如邮政编码。这种类型的数据非常适合缓存和通过引用传递,而不是复制它。

  3. 如前所述,使用像 Ehcache 这样的缓存框架。它减少了应用程序中对管道代码的需求,并允许跨所有会话共享缓存,而不是复制数据。当然,如果您只是在会话中存储用户特定的数据,那么共享不会有很大的好处。像这样的框架还允许您配置缓存策略,例如,如果需要,它将开始使用数据库。

于 2010-03-25T12:20:47.183 回答
2

要么将其置于应用程序范围内(如果它不是特定于用户的),要么替换为基于请求的数据库端分页/过滤(如果它是特定于用户的)。

我想数据已经存储在数据库中。那么把它放在应用程序范围内没有多大意义。当Java 代码在Java 内存中拖拽/复制数据存储(例如RDBMS)的整个数据集,然后使用Java 代码在Java 内存中完成这项工作时,您总是会遇到内存问题。当您甚至在 Web 应用程序的会话范围内存储/复制它时,它确实会变得更糟。

最节省内存的方法是让数据库完成它被发明的任务。SQL 语言在每个ORDER BY子句下为您提供排序、WHERE过滤子句和(数据库供应商特定的)LIMIT/OFFSET子句/子选择/函数,以仅返回基于firstrowrowcountlastrow的记录子集。这样一来,您最终只会得到 Java 内存中实际要显示的数据集。

您可以在我之前发布的这个答案中找到所需 SQL 查询的示例。希望这可以帮助。

于 2010-03-25T11:44:47.693 回答
1

仅存储位于共享池中的对象的唯一标识符(内存、数据库、平面文件)

于 2010-03-25T11:47:42.760 回答
0

如果您使用视图中的数据,您可以在请求上设置属性或使用表单。如果您需要在会话处于活动状态时获取数据,请将其放入数据库中。

于 2010-03-25T11:46:20.463 回答
0

我建议您尝试以下两种选择之一:

于 2010-03-25T11:47:32.680 回答