Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为GWT RPC异步调用启用缓存_Gwt_Caching_Local Storage - Fatal编程技术网

为GWT RPC异步调用启用缓存

为GWT RPC异步调用启用缓存,gwt,caching,local-storage,Gwt,Caching,Local Storage,我正在考虑引入某种缓存机制(如HTML5本地存储),以尽可能避免频繁的RPC调用。我想在下面的代码段中获得关于如何在不改变大部分体系结构的情况下引入缓存的反馈(如使用gwt调度) void getData(){ /*已跳过加载指示器代码*/ /*下面是为SomeServiceAsync生成的gwt maven插件*/ SomeServiceAsync.Util.getInstance().GetDatabaseArchCriteria(searchCriteria,new AsyncCallba

我正在考虑引入某种缓存机制(如HTML5本地存储),以尽可能避免频繁的RPC调用。我想在下面的代码段中获得关于如何在不改变大部分体系结构的情况下引入缓存的反馈(如使用gwt调度)

void getData(){
/*已跳过加载指示器代码*/
/*下面是为SomeServiceAsync生成的gwt maven插件*/
SomeServiceAsync.Util.getInstance().GetDatabaseArchCriteria(searchCriteria,new AsyncCallback()){
失败时的公共无效(可丢弃){
/*已跳过加载指示器代码*/
Window.alert(“问题:+catch.getMessage());
}
成功时公共无效(列表数据列表){
/*已跳过加载指示器代码*/
}
});
}
我可以想到的一种处理方法是使用自定义MyAsyncCallback类定义onSuccess/onFailure方法,然后执行类似的操作-

void getData(){
AsyncCallback callback=新的MyAsyncCallback;
//检查缓存中是否存在数据
如果(缓存当前)
onSuccess(dataRetrievedFromCache);
其他的
//调用RPC并与上面相同,当然,在适当的地方更新缓存
}
除此之外,我还有一个问题。流行浏览器的LocalStorage可用的最大存储大小是多少?浏览器如何管理不同应用程序/URL的LocalStorage?任何指点都将不胜感激

我建议添加一个处理缓存的。委托类可以如下所示:

公共类委托{
私有静态SomeServiceAsync服务=SomeServiceAsync.Util.getInstance();
私人名单数据;
公共静态void getData(回调){
如果(日期!=null){
callback.onSuccess(数据);
}否则{
service.getData(新回调(){
公共onSuccess(列表结果){
数据=结果;
callback.onSuccess(结果);
});
}
}
}

当然,这是一个粗糙的示例,您必须改进代码以使其可靠。

我确实花了太长时间才决定使用哈希映射来缓存结果

我的策略不是使用singleton hashmap,而是使用singleton common objects类来存储缓存的静态实例。我看不出为什么要加载具有过多hashtree分支级别的单个hashmap

减少哈希解析的数量

如果我知道我处理的对象是Employee、Address、Project,我会创建三个静态哈希

最终静态私有映射employeeCache=
新的HashMap();
最终静态私有映射地址缓存=
新的HashMap();
最终静态私有映射projectCache=
新的HashMap();
公共静态无效员工(长id,员工emp){
employeeCache.put(id,emp);
}
公共静态员工getEmployee(长id){
返回employeeCache.get(id);
}
公共静态无效员工(长id、地址地址){
addressCache.put(id,addr);
}
公共静态地址getEmployee(长id){
返回addressCache.get(id);
}
公共静态项目(字符串名称、地址地址){
projectCache.put(名称、地址);
}
公共静态地址getProject(字符串名称){
返回projectCache.get(名称);
}
将所有信息放在一张地图上会很麻烦。有效访问和存储数据的原则是——你确定的数据信息越多,你就越应该利用你拥有的信息来分离数据。这将降低访问数据所需的哈希分辨率。更不用说所有的ri了天空和不确定类型铸造将需要完成

尽可能避免散列

如果您知道始终只有一个值CurrentEmployee和NextTemployee, 避免将它们存储在Employee的哈希中。只需创建静态实例

Employee CurrentEmployee, NextEmployee;
这将完全避免需要任何哈希解析

避免污染全局命名空间

如果可能,将它们保留为类实例而不是静态实例,以避免污染全局命名空间

为什么要避免污染全局名称空间?因为,多个类会无意中使用相同的名称,从而由于全局名称空间混乱而导致无法计数的错误

将缓存放在最接近预期或使用的位置

如果可能,如果缓存主要用于某个类,请将缓存作为该类中的类实例保留。并为其他类需要从该缓存获取数据的任何罕见实例提供eventbus事件

这样你就有了一个预期的模式

ZZZManager.getZZZ(id);
如有可能,完成缓存

否则/并通过提供Putter和Getter将其私有化。不要允许其他类无意中重新实例化缓存,尤其是当某一天您的类成为通用实用程序库时。Putter和Getter也有机会验证请求,以避免请求清除缓存或将应用程序推入例外通过直接向缓存显示缓存无法处理的键或值来进行初始化

将这些原则转换为Javascript本地存储

GWT页面说

明智地使用命名约定有助于处理存储数据。例如,在名为MyWebApp的web应用中,与名为Stock的UI表中的行关联的键值数据的键值名称可以以MyWebApp.Stock作为前缀

因此,在类中补充HashMap,使用相当粗糙的代码

公共类EmployeePresenter{
Storage empStore=Storage.getLocalStorageIfSupported();
HashMapEmployeeCache;
公共雇员代表(){
if(empStore==null){
employeeCache=newhashmap();
}
}
私有字符串getPrefix(){
返回此.getClass()+”