GWT Requestfactory 性能建议

9
我注意到使用GWT requestfactory时性能非常差。例如,我的服务层需要2秒钟才能完成的请求,GWT需要20秒才能序列化。我的服务返回大约100个将成为EntityProxies的对象。每个对象都有将成为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

我已经在ServiceLayerDecorator#invoke方法中添加了一些分析代码,并在计时器中包含了整个servlet。 我独立地对服务进行了分析,确实返回了大约2秒的结果。

我正在使用GWT 2.4,但已在GWT 2.5rc1和GWT 2.5rc2上进行了测试。我的后端在GAE上,但我不认为这里起作用。

我发现针对2.4提出了此错误,似乎与此密切相关。 我手动应用了来自此 Google Group的补丁,但没有任何运气。

我的领域模型如下:

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;
}

我的问题是:

  • 我是否正确地对代码进行了分析,并将问题隔离到了GWT序列化中?
  • 我是否做错了什么,导致这种行为发生?
  • 我如何更好地对GWT序列化代码进行分析,以尝试找出原因?

我认为你的数据结构过于复杂。尝试将其扁平化。您能详细解释一下DTO的外观吗?您使用AutoBean吗? - Christian Kuetbach
我已经将部分领域模型添加到问题中。在一些更昂贵的模型中,这是正在加载的图形。你有没有任何参考来证明数据结构太复杂了?它的复杂性体现在哪里(大小还是关系)?对于任何商业应用程序来说,它似乎相当合理。我已经开始研究AutoBean,并考虑从服务器返回JSON。 - Brad
我刚刚对一个请求进行了分析,该请求加载了约10个EntityProxies(没有ValueProxy或嵌套关联)。服务层花费了约1秒钟,但GWT序列化却花费了略超过3秒钟。 - Brad
1个回答

1
我是否正确地对代码进行了分析,并将问题隔离到了GWT序列化方面?
RequestFactory使用反射比GWT-RPC等技术更加频繁,因此在某些情况下会导致性能问题并不奇怪。而且GAE可能在这里发挥了作用。我认为RequestFactory(实际上是AutoBean部分)可以从构建时的代码生成中获得很大的好处。
我是否做错了什么导致了这种行为?
请检查您的定位器的find和/或isLive方法。
如何更好地对GWT序列化代码进行分析以尝试找出原因?
了解请求反序列化、应用更改以及响应序列化所花费的时间也是很有趣的。别忘了从中减去find和isLive所花费的时间。

我很快就会得到时间的详细分解。我大部分周末都在对我的代码进行分析,发现一个问题是包含域模型作为参数的请求没有昂贵的序列化时间。例如,Trip service.save(Trip t) 的序列化时间约为100毫秒。而 Trip service.find(String id) 的序列化时间接近12,000毫秒。相同的图形结构但不同的上下文。此外,我的isLive方法被存根以始终返回true。 - Brad
有趣。请随意在GWT跟踪器中打开一个新问题,并告诉我们您在分析应用程序时发现的情况。提前致谢! - Thomas Broyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接