Использование гибернации в качестве резервной копии для большого набора данных в JTable

У вас есть приложение, в котором есть Jtable с данными, хранящимися в ОЗУ, таблица может содержать до 1 000 000 строк на 100 столбцов, так что это просто использует слишком много памяти. Итак, теперь я перехожу к поддержке JTable из базы данных, но я думаю, что прямой переход из JTable в базу данных не сильно поможет, потому что либо все данные из базы данных будут загружены в память при инициализации jtable, либо как пользователь прокручивает таблицу вниз. Я бы выбрал этапы, чтобы получить следующие данные, что было бы слишком медленно, и как бы я справился с сортировкой.

Поэтому я думаю, что правильным решением будет вставить Hibernate между JTable и базой данных, но я до сих пор не совсем понимаю, как это поможет с действительно большим JTable.

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

РЕДАКТИРОВАТЬ: я читал некоторые комментарии в других потоках о том, что таблица с таким большим количеством данных должна иметь фильтры, чтобы когда-либо отображалось только подмножество данных. Я согласен с этим как с общим принципом, и я предоставлю фильтр, ОДНАКО только пользователь может решить, как он хочет его отфильтровать, и мне все еще нужно предоставить опцию «ВСЕ», и здесь все может взорваться.

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


person Paul Taylor    schedule 15.11.2011    source источник
comment
См. также Знаете ли вы о сложном компонент электронной таблицы для Swing. Слой JPA может упростить пейджинг.   -  person trashgod    schedule 16.11.2011


Ответы (2)


Обычно для функции, которая отображает большое количество записей в формате таблицы, чтобы потреблять меньше памяти, записи будут отображаться страница за страницей, как Лига репутации Stackoverflow

API Criteria и Query Hibernate предоставляет следующие функции для разбиения на страницы:

В JTable у вас должны быть переменные для хранения количества записей, отображаемых на странице (pageNum), и текущего номера страницы (pageNum). Всякий раз, когда пользователь изменяет pageNum, перемещаясь по странице вперед или назад, вы получаете записи для этой страницы:

Query q = entityManager.createQuery("from someTable tbl order by tbl.id asc");
q.setFirstResult((pageNum -1)*pagesize).setMaxResults(pagesize); 

Важные точки:

  • Без предложения order by порядок выбранной строки непредсказуем. Таким образом, важно, чтобы запрос был отсортирован по предложению order by, чтобы можно было сохранить порядок отображения записей при просмотре страницы вперед и назад.

Вы можете обратиться к этому (используйте Google переводчик для перевода на английский) и его Github для примера о Разбиение на страницы JTable с использованием Hibernate или JDBC.

person Ken Chan    schedule 28.11.2011
comment
Я никогда не думал о разбивке на страницы в JTable, да, я думаю, что это может работать и звучит намного проще, чем таблица, как представление идеи более крупной таблицы, и ссылка полезна, спасибо. - person Paul Taylor; 30.11.2011

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

Однако, когда сеанс гибернации открыт слишком долго, он становится медленным (используются внутренние кеши, которые засоряются)

Вы также можете рассмотреть некоторую ориентированную на документы базу данных No-SQL (например, mongodb или множество других), которая будет вести себя лучше и обеспечивать загрузку по запросу с меньшими накладными расходами)

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

person Konstantin Pribluda    schedule 28.11.2011
comment
Спасибо, хорошие моменты. Я не думаю, что база данных на основе документа была бы для меня настолько хороша, потому что тогда мне пришлось бы загружать весь документ, представляющий строку, а не только видимые данные. - person Paul Taylor; 30.11.2011
comment
mongodb позволяет загружать подмножество документов, но в любом случае использование базы данных nosql должно быть хорошо обосновано, а теории и знаний меньше, чем для реляционных баз данных. - person Konstantin Pribluda; 30.11.2011