Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод больших объемов данных, выбираем стратегию 
:(
    Опции темы
Souljah
Дата 18.11.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.12.2004

Репутация: 3
Всего: 7



всем привет

такая задача:

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

в голову приходят следующие варианты:

1) загружать все целиком, и показывать необходимую страницу, храня общий список в List d синглтоне и обновляя по мере необходимости

+просто, быстрая работа
- неудобно будет делать выборки по нескольким сложным критериям - добавляется дополнительный громоздкий анализ
- очевидно, при большом количестве записей заметно отожрется память (возможно, на данный момент не такая уж серьезная проболема)
- сложность с обновлениями, методы доступа к данным должны быть синхронизированы для того, чтобы избежать конфликтов при чтении обновляемых данных, таким образом, во время обновления для всех пользователей ресурс будет недоступен, что не есть гуд, особенно если записей много и обновление займет значительное время


2) получать ResultSet, затем, по мере выбора страниц скролить его, динамически подгружая новые
+ не весь селект целиком
- хранение незакрытого rs в сессии, что при множестве пользователей быстро убьет датасурс и будет зело жрать память
- невозможно применить удобный паттерн "Session per request" - когда пользовательская сессия в ThreadLocal закрывается фильтром после отправки ответа на пользовательский запрос
- опять же сложно определить грамотную политику обновлений, т.е. когда система должна решить, что текущий rs неактуален и пересоздать его.
имхо маложизнеспособный вариант

3) делать запрос целиком, но загружать rs только до требуемой страницы, затем закрывая rs (упрощенный вариант №2)

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

4) юзать предоставляемую некоторымы БД возможность выборок "от... до..."

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

пока что все
ваши варианты, господа?
PM MAIL   Вверх
batigoal
Дата 18.11.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Мы реализовывали именно четвертый вариант, но у нас было дополнительное условие - ограниченность ресурсов (в память могло загружаться не более 500 записей).

Это сообщение отредактировал(а) Lamer George - 18.11.2005, 13:10


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Souljah
Дата 18.11.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.12.2004

Репутация: 3
Всего: 7



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

Это сообщение отредактировал(а) Souljah - 18.11.2005, 13:20
PM MAIL   Вверх
Это я
Дата 18.11.2005, 15:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я испоьзую 3, только не вычитываю,а ставлю курсор на нужную запись! это требует JDBC 2 и все...
  Вверх
Souljah
Дата 18.11.2005, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.12.2004

Репутация: 3
Всего: 7



Цитата
Я испоьзую 3, только не вычитываю,а ставлю курсор на нужную запись! это требует JDBC 2 и все...



с какими параметрами создается resultSet чтобы данные не тянулись при скролле?
PM MAIL   Вверх
Stampede
Дата 18.11.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Я обычно использую 4-й способ, то есть "от и до". В постгрессе такое делается - просто сказка. В других СУБД - через два вложенных селекта. А кто вложенные селекты не поддерживает, тех я даже и за СУБД не считаю smile

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

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

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

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

Повторю, такой подход наиболее полезен в ситуации, когда выборка осуществляется из большого массива данных по неизвестным наперед критериям (то есть когда невозможно заранее оптимизировать индексы и/или план выполнения запроса). Тогда вместо того, чтобы запускать трудный селект каждый раз, когда юзер тыкает в очередную страницу, мы делаем это только один раз, а потом просто порхаем над готовым списком. В результате все летает, юзеры щасливы, архитектор не страдает расстройством сна smile

PM WWW   Вверх
KostenkoSergey
Дата 18.11.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Цитата
Я испоьзую 3, только не вычитываю,а ставлю курсор на нужную запись! это требует JDBC 2 и все...


-не понял! smile
У меня данные выгребает сессион бин....
отослал я клиенту 100 записей - запомнил де курсор..
но ведь не факт , что при следующем запросе - я попаду на этот же бин...
или я чегой то недопонял.


мы 4 вариант стараемся юзать ....
PM ICQ   Вверх
LSD
Дата 18.11.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Цитата(Stampede @ 18.11.2005, 19:31)
В постгрессе такое делается - просто сказка. В других СУБД - через два вложенных селекта.

PostgreSQL просто скрывает это от программиста. Выборка записей с i по j имеет смысл только если порядок записей фиксирован, а это достижимо только в результате предварительной сортировки. smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.