2010-03-02 67 views
15

我们有一个gwt-client,它从我们的服务器接收到大量的数据。从逻辑上讲,我想在客户端缓存数据,避免服务器受到不必要的请求。GWT中的客户端缓存

截至今天,我已经放弃了我的模型来处理缓存数据,这不能很好地扩展。这也是一个问题,因为我们团队中的不同开发人员开发自己的“缓存”功能,使项目重复工作。

我在想如何实现一个“单一入口点”,它处理所有的缓存,让模型无法知道如何处理缓存。

有没有人有GWT客户端缓存的经验?有没有可以实施的标准方法?

回答

10

我建议你看看gwt-presenterCachingDispatchAsync。它为执行远程命令提供了一个单一入口点,因此是缓存的绝佳机会。

A recent blog post概述了一种可能的方法。

6

你可能想看看命令模式; Ray Ryan在Google IO上进行了一次关于GWT最佳实践的演讲,下面是一个成绩单:http://extgwt-mvp4g-gae.blogspot.com/2009/10/gwt-app-architecture-best-practices.html

他建议使用命令模式,使用Action和Response/Result对象将服务代理抛出和导出。这些都是封装要在客户端上执行的任何缓存的绝佳对象。

这是一段摘录:“我有一个很好的实现缓存策略的货币单元,可能每当我看到相同的GET请求两次时,我就会缓存上次得到的响应,然后将它返回给我自己立即,不用担心服务器端的旅程。“

在一个相当大的项目中,我采取了另一个方向。我开发了一个DtoCache对象,它基本上持有对每个AsyncCallback的引用,这个AsyncCallback期望来自等待队列中的服务调用的响应。一旦DtoCache从服务器接收到对象,它们就被缓存在DtoCache中。此后,缓存的结果将返回给所有排队的新创建的AsyncCallbacks以进行相同的服务调用。

1

对于用于CRUD操作的已经完全构建的非常复杂的缓存引擎,请考虑Smart GWT。这个例子演示了为大型数据集做客户端操作自适应(当高速缓存允许的话),同时还支持呼叫的能力:

http://www.smartclient.com/smartgwt/showcase/#grid_adaptive_filter_featured_category

这种行为是通过如果你需要把你的ResultSet类暴露在它上面的widget:

http://www.smartclient.com/smartgwtee/javadoc/com/smartgwt/client/data/ResultSet.html

0

我以为Itemscript是一种整齐。这是一个可在客户端(GWT)和服务器上运行的RESTful JSON数据库。

看看吧!

-jP

1

有缓存的两个层次:

  • 缓存一个浏览器会话中。
  • 缓存跨浏览器会话,例如缓存数据在浏览器重新启动后应该可用。

什么缓存:依赖于应用程序,你可能想缓存

  • 为特定用户
  • 公共静态保护数据(或半静态的,例如,很少改变)数据

如何缓存:

  • 对于第一个高速缓存级别,我们可以按照答案中的建议使用GWT代码或编写自己的代码。
  • 对于第二个,我们必须使用浏览器缓存功能。标准的方法是把你的数据放在html里面(不管是静态的html文件,还是动态生成的jsp/servlet)。然后,您的应用程序使用http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html技术来获取数据。