客户端视图的非常大的对象集合。如何优化?

时间:2011-10-16 16:00:57

标签: java swing user-interface ejb thick-client

我有3层EJB应用程序,我需要在胖客户端(桌面Java应用程序)上创建一个显示非常大的对象集合(超过5000个订单)的视图。每个对象都具有子属性,这些属性也是复杂对象,例如:

class Address
{
 String value 
 // other properties
}

class Order
{
 public String Number

 // this is collection of complex object and I need first and last object to show it's
 // properties in view
 public List<Address> getAddresses()

 // other properties
}

视图是订单表:

号码| FirstAddress | LastAddress | ...

我的第一次尝试是加载完整的订单列表(没有子属性),然后在需要显示时动态下载子对象。但是当我有10000个订单并开始快速滚动时,UI就会变得没有响应。

然后我尝试加载所有需要在表中显示的订单和所有子项,但UI变得非常繁重和缓慢,可能是因为内存成本)。而且它根本不是胖客户端,因为我从db下载了几乎所有数据。

解决此任务的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

关注值对象数据传输对象模式。只发送你真正需要的东西。而不是发送域对象的图形,只需为每个视图创建一个或多个“愚蠢”平面对象(包含简单属性)。

答案 1 :(得分:2)

我建议实现某种分页,换句话说,你必须实现一种只检索所有数据的一小部分的机制,并在不同的页面中按块显示它们。

到目前为止,“如何”取决于你的方法。

  • 你可以使用一些编程模式 提到
  • 或者您可以在数据库级别实现它,在那里查询数据库服务器, 即根据所选的DBMS,您必须编写获取文件 以这样的方式查询它们只检索所有的一部分 数据,例如here.

希望这有帮助!

答案 2 :(得分:2)

假设您使用JTable作为合适TableModel的视图,请在结果到达时使用SwingWorkerpublish()查询数据库。为简单起见,这个example只是以10为块的方式获取随机数据。请注意,随着数据的累积,UI仍然保持响应。

答案 3 :(得分:1)

建议为你的列表创建一个代理对象,它只获取它的元素的一小部分,以及总数,然后能够按需加载原始列表的其他部分