Клиентский просмотр очень большой коллекции объектов. Как оптимизировать?
У меня есть 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
}
Представление представляет собой таблицу заказов:
Номер | Первый адрес | LastAddress | ...
Моей первой попыткой было загрузить полный список заказов (без дочерних свойств), а затем динамически загружать дочерние объекты, когда это необходимо для отображения. Но когда у меня 10000 заказов и я начинаю быструю прокрутку, пользовательский интерфейс перестает отвечать на запросы.
Затем я пытаюсь загрузить все заказы и все дочерние элементы, которые должны быть показаны в таблице, но пользовательский интерфейс становится очень тяжелым и медленным, возможно из-за стоимости памяти). И это совсем не толстый клиент, потому что я загружаю почти все данные из БД.
Какова наилучшая практика для решения этой задачи?
4 ответа
Предполагая, что вы используете JTable
как мнение подходящего TableModel
запросить базу данных, используя SwingWorker
а также publish()
результаты по мере их поступления. Для простоты этот пример просто выбирает случайные данные в блоках по 10. Обратите внимание, что пользовательский интерфейс остается отзывчивым по мере накопления данных.
Следуйте шаблону Value Object или Data Transfer Object. Отправляйте только то, что вам действительно нужно. Вместо того, чтобы отправлять граф объектов домена, просто создайте один или несколько "глупых" плоских объектов (связывающихся с простыми атрибутами) для каждого представления.
Я предлагаю реализовать какое-то разбиение на страницы, другими словами, вам нужно будет реализовать механизм для извлечения только небольшого подмножества всех ваших данных и показывать их по частям на разных страницах.
Пока именно "как" зависит от вашего подхода.
- Вы можете использовать шаблон программирования, подобный уже упомянутому
- или вы можете реализовать это на уровне БД, где вы запрашиваете сервер БД, т.е. в зависимости от выбранной СУБД вам придется написать выборку
запросы таким образом, что они получают только часть всех данных, как здесь.
надеюсь это поможет!
Рекомендуется создать прокси-объект для вашего списка, который просто получает только небольшую часть своих элементов, а также общее количество, а затем имеет возможность загружать по требованию другие части исходного списка.