当我向Java Swing JList组件添加RMI代理引用时,我遇到了巨大的性能问题。
我正在从服务器检索带有RMI的用户Profile
列表。检索本身只需要一秒左右,因此在这种情况下是可以接受的。但是,当我尝试将这些代理添加到JList
时,在自定义ListModel
和CellRenderer
的帮助下,添加约180个对象需要30-60秒。由于它是用户名称列表,因此最好按字母顺序显示它们。
最大的性能影响是当我将元素添加到ListModel时对其进行排序。由于列表将始终排序,因此我选择使用内置Collections.binarySearch()
来查找要添加的下一个元素的正确位置,并且比较器使用由Profile
定义的两种方法界面,即getFirstName()
和getLastName()
。
有没有办法加快这个过程,或者我只是以错误的方式实现它?或者这是RMI的“特征”?我真的很想能够在本地缓存远程对象的一些数据,以最小化远程方法调用。
更新和可能的解决方案:我创建了实现远程接口的本地类,并包含对远程对象的引用。速度增强是显而易见的,它现在无缝地工作(至少到目前为止)。我希望这对我们在应用程序中使用的其他接口同样有效。感谢我认为帮助指导我的输入。
答案 0 :(得分:1)
我认为您需要将显示字段添加到Profile对象并使用配置文件返回它们。可以在单个检查器视图中恢复整个配置文件,但如果在概览视图中将它们放回原始视图中,则应将它们带回初始查询中。
答案 1 :(得分:1)
Patrick,你在Collections.binarySearch
个对象上打电话给Remote
吗?如果此方法必须向rmi服务器询问有关对象的更多信息,则可能是您无意中在网络中造成大量流量。
答案 2 :(得分:0)
(a)它与RMI无关。
(b)与binarySearch()相处只是浪费时间。使用Collections.sort()对项目进行排序或最后排序,或者将TreeModel基于本地排序的集合。