【问题标题】:Server side caching for Java/Java EE applicationJava/Java EE 应用程序的服务器端缓存
【发布时间】:2013-04-28 17:48:39
【问题描述】:

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

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

还有其他建议吗?

【问题讨论】:

    标签: java caching


    【解决方案1】:

    我假设您为此使用数据库后端。我会使用限制来返回小块数据,大多数数据库供应商都有解决方案。这将使您的查询更快,并且大多数具有网格类型组件的 JS 名作都将支持分页结果(例如 ExtJS)。

    如果您从第 3 方获取数据并将其传递(是否进行了一些修改),我仍然会坚持使用数据库并使用这样的工作流程:来自第 3 方的池数据,保存在数据库中,从您的小部件调用客户需要的块。

    希望这会有所帮助。

    【讨论】:

    • 我别无选择,只能在第一次请求时一次性获取所有数据。填充这些数据也很昂贵,这就是为什么我不想每次都进行处理。所以限制数据库查询不是一种选择。谢谢。
    【解决方案2】:

    Java EE Web 应用程序中最便宜(而且不是那么低效的缓存数据方式)是按照您的意图使用 Session 对象。它是无效的,因为它需要开发人员确保缓存不会泄漏内存;因此,一旦不再需要对象,开发人员就可以取消对该对象的引用。

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

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

    【讨论】:

    • 只要用户处于活动状态(只要用户会话有效),我就需要将此数据保存在缓存中。性能是我热衷于缓存如此大数据的唯一原因。请求部分数据与检索所有数据集一样昂贵。因此,在每个请求期间,大约需要 1 分钟左右,这是不可接受的。不管怎样,会继续寻找更好的选择。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2013-04-06
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多