以下是我的情况:我有Java EE单页面应用程序。所有客户端 - 服务器通信都是基于AJAX的,JSON用作交换数据的格式。我的一个请求大约需要1分钟来计算客户端所需的数据。此数据也很大(可能> 20 MB)。所以不可能一次性将整个数据传递给javascript。因此,我只将少量记录传递给客户端,并使用网格显示带分页选项的数据。
现在,当用户点击下一页按钮时,我需要获得更多数据。我的问题是如何在服务器端缓存数据?我一天只需要一个用户使用这些数据。您是否建议使用会话ID作为密钥将第一个请求缓存到所有数据?
还有其他建议吗?
答案 0 :(得分:1)
Java EE Web应用程序中最便宜的(而不是无效的缓存数据方式)是使用您打算这样做的Session对象。这是无效的,因为它要求开发人员确保缓存不会泄漏内存;因此,一旦不再需要该对象,开发人员就可以取消对该对象的引用。
但是,即使您希望实现穷人的缓存,也不建议缓存20MB的数据,因为它不能很好地扩展。当多个用户使用相同的应用程序功能时,可伸缩性问题就会出现,在这种情况下,20MB就是大量数据。
最好根据ValueList design pattern以JSON的形式返回分页的“数据集”。每次查询数据的请求都将导致数据的部分检索,然后将其发送到客户端。这样,您就不必缓存查询执行的完整结果,也可以返回部分数据集。关于您是否要缓存,完全取决于您;通常对一次又一次使用的大型数据集进行缓存。
答案 1 :(得分:1)
我假设您正在使用数据库后端。我使用限制来返回小块数据,大多数数据库供应商都有解决方案。这将使您的查询更快,并且大多数具有网格类型组件的JS fameworks将支持分页结果(例如ExtJS)。
如果您从第三方获取数据并将其传递(通过一些修改或不进行),我仍然坚持使用这样的工作流程:来自第三方的池数据,保存在数据库中,从您的小部件调用小客户要求的块。
希望这有帮助。