4

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

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
}

该视图是一个订单表:

号码 | 第一地址 | 最后地址 | ...

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

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

解决此任务的最佳实践是什么?

4

4 回答 4

2

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

于 2011-10-16T16:09:53.497 回答
2

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

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

  • 您可以使用一些已经提到的编程模式
  • 或者您可以在数据库级别实现它,您可以在其中查询您的数据库服务器,即根据所选的 DBMS,您必须以
    它们仅检索所有数据的一部分的方式编写提取查询,就像这里一样。

希望这可以帮助!

于 2011-10-16T16:41:17.770 回答
2

假设您使用 aJTable作为合适的视图,请TableModel使用 a 查询数据库,SwingWorkerpublish()在结果到达时进行查询。为简单起见,此示例仅以 10 个块为单位获取随机数据。请注意,随着数据的累积,UI 会保持响应。

于 2011-10-16T17:49:21.350 回答
1

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

于 2011-10-16T16:09:05.940 回答