GWT RequestFactory 性能

Posted

技术标签:

【中文标题】GWT RequestFactory 性能【英文标题】:GWT RequestFactory Performance 【发布时间】:2013-01-16 16:49:52 【问题描述】:

我对 RequestFactory 和 GWT 的性能有疑问。我有一个包含 8 个字段的域实体,它返回大约 1000 个 EntityProxies。请求触发和响应之间的时间约为 20 秒。我也是这样做的,但是返回 10 个 EntityProxies,时间是 17 秒,几乎一样。

这是因为我是在开发模式下工作,还是当我将代码发布到网络时,时间会一样?

有什么方法可以提高性能吗? ,我只是在读取数据,所以也许只能读取而不写入的东西可能是解决方案?

我读到这篇文章的内容与我的问题类似:

GWT Requestfactory performance suggestions

非常感谢。

PD:我在某处读到,一种解决方案可能是在服务器中创建一个 xml,将其发送到客户端并在那里重新创建对象,我不想这样做,因为它真的会改变我的应用程序的设计.

【问题讨论】:

【参考方案1】:

感谢大家的帮助,我现在意识到使用请求工厂检索数千条记录可能是一个错误。

根据这篇文章,我最初使用 Locator 覆盖 isLive() 和 Find() 方法: gwt-requestfactory-performance-suggestions

响应时间减少到 13 秒左右,但还是太长了。

但我很容易就解决了。我没有返回 1000+ Entities ,而是创建了一个新的数据库表,其中每个字段都有所有相同的字段记录(1000+)并由分隔符连接(每个 db 字段的长度约为 10000 )并且我只有一个记录在表中大约有 8 个字段。

类似这样的:

 Field1           |           Field2          |           Field3         

Field1val;Field1val;Field1val;....... | Field2val;Field2val;Field2val;...... | Field3val;Field3val;Field3val;......

我通过 RequestFactory 将那条记录返回给我的客户,它大大降低了速度!大约 1 秒。我在客户端解析这个大字符串,持续时间约为 500 毫秒。因此,与其浪费大约 20 秒,现在只需大约 1-2 秒即可完成。

顺便说一下,我只是显示信息,没有必要插入、删除或更新记录,所以这个解决方案适合我。

我想我可以分享这个解决方案。

【讨论】:

【参考方案2】:

GWT 中的性能分析和修复问题很棘手。避免在 GWT 托管模式下进行所有分析。它们并不意味着任何有用的东西。

您应该只在 WEB 模式下配置文件。

GWT RequestFactory 在设计上比 GWT RPC 和 GWT JSON 等要慢。这是与 GWT RF 计算增量并在保存时仅向服务器发送少量信息的能力之间的权衡。

您应该重新检查您的应用程序设计以避免加载 1000 个代理。 RF 是指类似“表单”的应用程序。您可能需要 1000 个代理的唯一原因是用于网格显示。在这种情况下,您可能可以使用分页异步网格。

【讨论】:

【参考方案3】:

您应该分析您的应用,以了解在以下步骤上花费了多少时间:

    从数据库(服务器)检索的实体:这可以使用二级缓存和优化查询来改进 序列化为 JSON(服务器)的实体:这里有一个开销,因为 RequestFactoryAutoBean 分别依赖于反射。您可以尝试仅传输您也将在客户端上显示的实体。另一个大大减少延迟的优化是覆盖 isLiveEntitiyLocator 方法并返回 true 从服务器到客户端传输数据的 HTTP 请求(有线):您可以考虑使用 gzip 压缩来减少必须传输的数据量(如果您通过线)。 客户端(客户端)上的反序列化:这应该很快。有一个基准表明 AutoBean 序列化是序列化 JSON 的最快方法之一。同样,这将受益于不通过网络发送整个对象图。

提高性能的一种方法是使用缓存。您可以使用 html5 localstorage 在客户端缓存数据。这特别适用于不经常更改的数据。

【讨论】:

以上是关于GWT RequestFactory 性能的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 RequestFactory 与 GWT-RPC?

GWT/AppEngine:设计 RequestFactory 工作流以更好地处理异常

如何在小工具中使用 GWT RequestFactory?

GWT 2.6 - RequestFactory Locator 找不到类似的域方法

GWT RequestFactory + CellTable

GWT-RPC 和 RequestFactory 是互斥的吗?