2010-08-02 133 views
3

这是我的情况:我有Java EE单页应用程序。所有客户端 - 服务器通信都是基于AJAX的JSON格式来交换数据。我的一个请求需要大约1分钟来计算客户所需的数据。此外这个数据是巨大的(可能> 20 MB)。所以不可能一次将整个数据传递给JavaScript。所以出于这个原因,我只传递了几个记录到客户端,并使用网格显示数据与分页选项。Java/Java EE应用程序的服务器端缓存

现在,当用户点击下一页按钮,我需要获得更多的数据。我的问题是如何缓存服务器端的数据?我只需要为一位用户提供这些数据。你会建议使用会话ID作为密钥缓存所有数据第一个请求吗?

其他建议?

回答

1

Java EE Web应用程序中最便宜的(也并非如此无效的缓存数据)方式是使用Session对象,就像您打算这样做。这是无效的,因为它要求开发人员确保缓存不会泄漏内存;所以一旦对象不再需要时,开发人员就可以取消对该对象的引用。

但是,即使您希望实施穷人的缓存,缓存20MB数据也不可取,因为它无法很好地扩展。当多个用户使用应用程序的相同功能时,可扩展性问题就会增加,在这种情况下,20MB是大量数据。

根据ValueList design pattern,最好还是以JSON的形式返回分页“数据集”。每个查询数据的请求都会导致数据的部分检索,然后将数据发送到客户端。这样,您永远不必缓存查询执行的完整结果,也可以返回部分数据集。至于是否要缓存,完全取决于您;通常缓存是针对一次又一次使用的大型数据集完成的。

+1

只要用户处于活动状态(只要用户会话有效),我需要将此数据保存在缓存中。性能是我热衷于缓存这些大数据的唯一原因。请求部分数据与检索所有数据集一样昂贵。所以在每次请求时,大约需要1分钟左右,这是不可接受的。无论如何,将继续寻找更好的选择。谢谢。 – ashish 2010-08-02 12:09:20

1

我假设你正在使用DB后端。我会使用限制来返回小块数据,大多数数据库供应商都为此提供了解决方案。这会让你的查询更快,而且大多数带有网格类型组件的JS fameworks都会支持分页结果(例如ExtJS)。

如果您从第三方获取数据并将其传递(经过一些修改或不),我仍然坚持数据库并使用这样的工作流:来自第三方的池数据,保存在数据库中,从您的小部件调用客户要求的小块。

希望这会有所帮助。

+1

我别无选择,只能在首次请求时一次性提取所有数据。同时填充这些数据也很昂贵,这就是为什么我不想每次都处理数据的原因。所以用DB查询限制不是一个选项。谢谢。 – ashish 2010-08-02 12:05:12