【问题标题】:Poor performance using RMI-proxies with Swing components使用带有 Swing 组件的 RMI 代理时性能不佳
【发布时间】:2010-05-21 06:44:20
【问题描述】:

当我将 RMI 代理引用添加到 Java Swing JList 组件时,我遇到了巨大的性能问题。

我正在从服务器检索带有 RMI 的用户 Profiles 列表。检索本身只需要一秒钟左右,因此在这种情况下是可以接受的。但是,当我尝试将这些代理添加到 JList 时,在自定义 ListModelCellRenderer 的帮助下,添加大约 180 个对象需要 30-60 秒。由于是用户名列表,最好按字母顺序显示。

最大的性能损失是当我将元素添加到 ListModel 时对其进行排序。由于列表总是会被排序,我选择使用内置的Collections.binarySearch()来找到下一个要添加的元素的正确位置,比较器使用Profile接口定义的两种方法,即@ 987654327@和getLastName()

有什么方法可以加快这个过程,还是我只是以错误的方式实现它?或者这是 RMI 的“特性”?我真的很想能够在本地缓存远程对象的一些数据,以最大限度地减少远程方法调用。


更新和可能的解决方案: 我创建了实现远程接口并包含对远程对象的引用的本地类。速度提升很明显,现在可以无缝运行(至少到目前为止)。我希望这同样适用于我们在应用程序中使用的其他接口。感谢您的意见,我认为它们对我有帮助。

【问题讨论】:

  • 拨打一个电话以获取不同的配置文件,而不是多次调用。这会有所帮助。
  • 关键是你也缓存了firstName和lastName吧?否则我很惊讶它有帮助。

标签: java performance rmi


【解决方案1】:

我认为您需要将显示字段添加到您的 Profile 对象并将它们与配置文件一起返回。在单个检查器视图中带回整个配置文件很好,但如果您将它们放在概览视图中,则应将它们带回初始查询中。

【讨论】:

  • 不确定显示字段和检查器视图的确切含义。 Profile 类定义了属性 firstName 和 lastName。对象本身通过 Hibernate 映射到数据库。
【解决方案2】:

Patrick,你在 Remote 对象上调用 Collections.binarySearch 吗?如果此方法必须向 rmi 服务器询问有关对象的更多信息,则可能是您无意中导致了网络上的大量流量。

【讨论】:

    【解决方案3】:

    (a) 与 RMI 无关。

    (b) 玩弄 binarySearch() 只是在浪费时间。使用 Collections.sort() 首先或最后对项目进行排序,或者将 TreeModel 建立在本质上排序的集合上。

    【讨论】:

    • 无论我采取哪种方式 - 无论是在将集合添加到 ListModel 之前对集合进行预排序,还是在 ListModel 中使用排序集合,性能都相当差。我猜这与进行两次 RMI 调用以检索配置文件的名字和姓氏的比较器有关。
    • 当然。您应该缓存这些,它们会在排序或 binarySearch() 期间经常被调用。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2011-11-24
    • 1970-01-01
    • 2016-07-31
    • 2016-02-06
    相关资源
    最近更新 更多