【发布时间】:2012-10-10 06:50:10
【问题描述】:
我发现使用 GWT requestfactory 时性能非常差。例如,一个请求需要我的服务层 2 秒才能完成,而 GWT 需要 20 秒来序列化。我的服务返回约 100 个 EntityProxies。每个对象都有 4 个 ValueProxies 和 2 个 EntityProxies(100 个根级 EntityProxies、400 个 ValueProxies 和 200 个额外的 EntityProxies)。但是,我在更小的数据集上看到同样的 10 倍性能下降。
日志sn-p示例:
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 包装在一个计时器中。我已经对服务本身进行了分析,它确实在~2s 内返回了结果。
我正在使用 GWT 2.4,但已在 GWT 2.5rc1 和 GWT 2.5rc2 上对此进行了测试。我的后端在 GAE 上,但我不认为这在这里发挥了作用。
我发现this bug 针对 2.4 提出申请,这似乎非常相关。我已经从this 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 吗?
-
我在问题中添加了部分领域模型。在一些更昂贵的图中,这是正在加载的图表。你有没有说数据结构太复杂的参考资料?它有什么复杂的(大小或关系)?对我来说,对于任何业务应用程序来说,这似乎都相当合理。我已经开始研究 AutoBean 并且正在考虑从服务器返回 JSON。
-
我刚刚分析了一个加载约 10 个 EntityProxies 的请求(没有 ValueProxy 或嵌套关联)。服务层用了大约 1 秒,但 GWT 序列化只用了 3 秒多一点。
标签: gwt gwt2 requestfactory