GWT请求工厂性能建议

GWT请求工厂性能建议,gwt,gwt2,requestfactory,Gwt,Gwt2,Requestfactory,在使用GWT requestfactory时,我发现性能非常差。例如,我的服务层需要2秒才能完成fullfil的请求需要GWT 20秒才能序列化。我的服务将返回100个全方位的费用。这些对象中的每一个都将成为4个ValueProxies和2个以上的EntityProxies(100个根级别EntityProxies、400个ValueProxies和200个额外的EntityProxies)。然而,在更小的数据集上,我看到同样的性能下降了10倍 日志片段示例: D 2012-10-18 22:4

在使用GWT requestfactory时,我发现性能非常差。例如,我的服务层需要2秒才能完成fullfil的请求需要GWT 20秒才能序列化。我的服务将返回100个全方位的费用。这些对象中的每一个都将成为4个ValueProxies和2个以上的EntityProxies(100个根级别EntityProxies、400个ValueProxies和200个额外的EntityProxies)。然而,在更小的数据集上,我看到同样的性能下降了10倍

日志片段示例:

D 2012-10-18 22:42:39.546 ServiceLayerDecorator invoke: Inoking service layer took 2265 ms
D 2012-10-18 22:42:58.957 RequestFactoryServlet doPost: Entire request took 22870 ms
我已经向
servicelayercorator#invoke
方法添加了一些评测代码,并将整个servlet包装在一个计时器中。我已经分析了服务本身,它确实在2秒内返回结果

我使用的是GWT2.4,但已经在GWT2.5rc1和GWT2.5rc2上进行了测试。我的后端在GAE上,但我不认为这在这里起作用

我发现2.4的文件,这似乎是非常相关的。我已经从手动应用了修补程序,但没有任何运气

我的域模型如下所示:

class Trip {
  protected Address origin; // becomes ValueProxy
  protected Address destination; becomes ValueProxy
  protected Set<TripPassenger> tripPassengers; // Set of ValueProxies
}

class TripPassenger {
  protected Passenger passenger;
}

class Passenger {
  protected Account account;
}
班级旅行{
受保护的地址源;//成为ValueProxy
受保护的地址目标;成为ValueProxy
受保护的集;//值代理集
}
三等舱乘客{
受保护乘客;
}
头等舱乘客{
受保护帐户;
}
我的问题是:

  • 我是否正确地分析了代码并将问题隔离到GWT序列化
  • 我是不是做错了什么会导致这种行为
  • 如何更好地分析GWT序列化代码以尝试找出原因
  • 我是否正确地分析了代码并将问题隔离到GWT序列化
RequestFactory大量使用反射(例如比GWT-RPC多得多),因此在某些情况下它会导致一些性能问题,我并不感到惊讶。GAE可以在这里发挥作用。
我相信RequestFactory(实际上是AutoBean部分)可以从构建时的代码生成中获益匪浅

  • 我是不是做错了什么会导致这种行为
检查定位器的
查找
和/或
isLive
方法

  • 如何更好地分析GWT序列化代码以尝试找出原因

了解请求反序列化、应用更改以及响应序列化所花费的时间也是很有意思的。别忘了从中减去花在
find
isLive

上的时间,我认为你的数据结构太复杂了。试着把它弄平。你能再解释一下你的DTO是什么样子吗?你使用AutoBean吗?我在问题中添加了部分域模型。在一些更昂贵的软件中,这是正在加载的图形。你有没有参考资料说数据结构太复杂了?它的复杂性是什么(大小或关系)?对我来说,这对于任何商业应用来说都是相当合理的。我已经开始研究AutoBean,并考虑从服务器返回JSON。我刚刚分析了一个加载多达10个EntityProxy(无ValueProxy或嵌套关联)的请求。服务层花了~1秒,但GWT序列化只花了3秒多。我很快就会得到时间的细分。周末的大部分时间我都在分析我的代码,我注意到的一件事是,包含域模型作为参数的请求不会有昂贵的序列化时间。例如
Trip service.save(Trip t)
的序列化时间约为100ms。而
Trip service.find(字符串id)
的序列化时间接近12k毫秒。相同的图形结构,但不同的上下文。另外,我的isLive方法被删除,以始终返回true.interest。请随意在GWT tracker中打开一个新问题,了解您在评测应用程序时发现的内容。提前谢谢!