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(服务器)的实体:这里有一个开销,因为
RequestFactory
和 AutoBean
分别依赖于反射。您可以尝试仅传输您也将在客户端上显示的实体。另一个大大减少延迟的优化是覆盖 isLive
的 EntitiyLocator
方法并返回 true
从服务器到客户端传输数据的 HTTP 请求(有线):您可以考虑使用 gzip 压缩来减少必须传输的数据量(如果您通过线)。
客户端(客户端)上的反序列化:这应该很快。有一个基准表明 AutoBean 序列化是序列化 JSON 的最快方法之一。同样,这将受益于不通过网络发送整个对象图。
提高性能的一种方法是使用缓存。您可以使用 html5 localstorage
在客户端缓存数据。这特别适用于不经常更改的数据。
【讨论】:
以上是关于GWT RequestFactory 性能的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用 RequestFactory 与 GWT-RPC?
GWT/AppEngine:设计 RequestFactory 工作流以更好地处理异常
GWT 2.6 - RequestFactory Locator 找不到类似的域方法