клиентский просмотр очень большой коллекции объектов.Как оптимизировать? - PullRequest
4 голосов
/ 16 октября 2011

У меня есть 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 |Первый адрес |LastAddress |...

Моей первой попыткой была загрузка полного списка заказов (без дочерних свойств), а затем динамическая загрузка дочерних объектов при необходимости для отображения.Но когда у меня 10000 заказов и я начинаю быструю прокрутку, пользовательский интерфейс перестает отвечать на запросы.

Затем я пытаюсь загрузить все заказы и все дочерние элементы, которые должны быть показаны в таблице, но пользовательский интерфейс становится очень тяжелым и медленным,возможно из-за стоимости памяти).И это совсем не толстый клиент, потому что я загружаю почти все данные из базы данных.

Как лучше всего решать эту задачу?

Ответы [ 4 ]

2 голосов
/ 16 октября 2011

Предполагая, что вы используете JTable как представление подходящего TableModel, запросите базу данных, используя SwingWorker и publish() результаты по мере их поступления,Для простоты этот пример просто выбирает случайные данные в блоках по 10. Обратите внимание, что пользовательский интерфейс остается отзывчивым по мере накопления данных.

2 голосов
/ 16 октября 2011

Отслеживать Объект значения или Объект передачи данных шаблон.Отправляйте только то, что вам действительно нужно.Вместо того, чтобы отправлять граф объектов домена, просто создайте один или несколько «глупых» плоских объектов (связывающихся с простыми атрибутами) для каждого представления.

2 голосов
/ 16 октября 2011

Я предлагаю реализовать своего рода разбиение на страницы, другими словами, вам нужно будет реализовать механизм для извлечения только небольшого подмножества всех ваших данных и показывать их по частям на разных страницах.

Точно "как" зависит от вашего подхода.

  • вы можете использовать какой-то шаблон программирования, подобный уже упомянутый
  • или вы можете реализовать его на уровне БД, где вы запрашиваете сервер БД, то есть в зависимости от выбранной СУБД вам придется написать выборку
    запросы таким образом, что они получают только часть всех данные, как в здесь.

надеюсь, это поможет!

1 голос
/ 16 октября 2011

Рекомендуется создать прокси-объект для вашего списка, который просто получает только небольшую часть своих элементов, а также общее количество, а затем имеет возможность загружать по требованию другие части исходного списка

...