我有一个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
}
视图是一个Orders表:
Number | FirstAddress | LastAddress |…
我的第一次尝试是加载完整的订单列表(没有子属性),然后在需要显示时动态下载子对象。但是当我有10000个订单并开始快速滚动时,UI变得无响应。
然后我尝试加载所有需要在表中显示的订单和所有子订单,但UI变得非常沉重和缓慢,可能是因为内存成本)。它根本不是厚客户端,因为我几乎从db下载所有的数据。
解决这个任务的最佳实践是什么?
假设您使用JTable
作为合适的TableModel
的视图,使用SwingWorker
和publish()
在结果到达时查询数据库。为简单起见,本例仅以10个为块获取随机数据。注意,当数据累积时,UI保持响应。
遵循值对象或数据传输对象模式。只发送你真正需要的东西。而不是发送一个图形的领域对象,只是创建一个或多个"愚蠢的"平面对象(包含简单的属性)每个视图。
我建议实现某种分页,换句话说,您必须实现一种机制,仅检索所有数据的一小部分,并在不同的页面中逐个块地显示它们。
确切地"如何"取决于你目前的方法。
- 你可以使用一些类似的编程模式提到
- 或者你可以在DB级实现它,在那里你查询你的DB服务器,例如,根据所选择的DBMS,您必须编写fetch
以这样一种方式进行查询,即它们只检索所有数据的一部分
希望这对你有帮助!
建议为您的列表创建一个代理对象,该对象仅获取其元素的一小部分,以及总数,然后有能力按需加载原始列表的其他部分