Java/Java EE应用程序的服务器端缓存

3
这是我的情况:我有一个Java EE单页应用程序。所有客户端与服务器的通信都是基于AJAX的,JSON被用作交换数据的格式。我的一个请求需要大约1分钟来计算客户端所需的数据。此外,这些数据非常庞大(可能>20 MB)。因此,不可能一次性将整个数据传递给JavaScript。因此,出于这个原因,我只向客户端传递了少量记录,并使用网格来显示带分页选项的数据。
现在,当用户点击下一页按钮时,我需要获取更多数据。我的问题是如何在服务器端缓存数据?我只需要这些数据为一个用户服务。您是否建议使用会话ID作为键在第一次请求时缓存所有数据?
还有其他建议吗?
2个回答

1

在Java EE Web应用程序中,最便宜(且不那么无效的缓存数据方式)是使用Session对象,就像您打算做的那样。这种方法并不高效,因为它要求开发人员确保缓存不会泄漏内存;因此,一旦不再需要该对象,开发人员必须将对该对象的引用置为空。

然而,即使您希望实现穷人的缓存,也不建议缓存20MB的数据,因为它不具备良好的可扩展性。当多个用户利用应用程序的相同功能时,可扩展性问题就会出现,在这种情况下,20MB是很多数据。

您最好返回基于ValueList设计模式的分页“数据集”形式的JSON。每次请求数据查询都会导致部分数据的检索,然后将其发送到客户端。这样,您永远不必缓存查询执行的完整结果,并且还可以返回部分数据集。是否进行缓存完全取决于您,通常缓存是针对反复使用的大型数据集进行的。


1
只要用户会话有效,我需要将这些数据保存在缓存中。性能是我想要缓存如此大量数据的唯一原因。请求部分数据与检索全部数据集一样昂贵。因此,在每个请求期间,它将花费约1分钟左右,这是不可接受的。无论如何,我将继续寻找更好的替代方案。谢谢。 - ashish

1

我假设你在使用数据库后端。我会使用限制来返回数据的小块,大多数数据库供应商都有解决方案。这样可以使查询更快,并且大多数带有网格类型组件的JS框架将支持对结果进行分页(例如ExtJS)。

如果你从第三方获取数据并传递(进行一些修改或不修改),我仍然会坚持使用数据库,并使用以下工作流程:从第三方收集数据,保存在数据库中,根据客户需求调用小块数据以供小部件使用。

希望这能帮到你。


1
我别无选择,只能在第一次请求时一次性获取所有数据。此外,填充这些数据是昂贵的,因此我不想每次进行处理。因此,限制数据库查询不是一个选项。谢谢。 - ashish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接