![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| maz543 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 7.2.2009 Репутация: нет Всего: нет |
Есть такая задача, необходимо выгрузить в файл из БД большое количество тяжелых объектов.
Наткнулся на ScrollableResults, но нигде не увидел описание как он работает и когда его нужно использовать. Написал маленький тест. Судя по sql логам, он делает select и отдает мне мои объекты по одному. Хочу услышать Ваше мнение, или ссылку на доки где все описано. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В общем, это аналог ResultSet (о чем кстати написано в документации). Единственное но, не советую делать двунаправленный ScrollableResults если СУБД его не поддерживает, иначе можно получить out of memory.
-------------------- 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. |
|||
|
||||
| maz543 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 7.2.2009 Репутация: нет Всего: нет |
Судя по логу, на criteria.scroll(); делается select всех объектов, чем он тогда отличается от criteria.list()? Объектов у меня очень много и все они в память не влезут. БД Oracle. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Так обычный ResultSet как раз под эту ситуацию и заточен. Он загрузит во внутренний буфер часть данных из базы. По мере того как вы выбираете строки командой next, эти данные из буфера могут удаляться и подгружаться следующая порция. Такое поведение логично для ResultSet, в котором предусмотрено движение только в одну сторону. И этот режим обычно по умолчанию. А вот если вы заказываете особый случай, т.е. добиваетесь возможности бродить по выборке в обе стороны, то это как раз и может привести к невозможности очистки буфера и проблеме с памятью. Наверное, чтобы этого избежать ScrollableResultSet и "отдает мне мои объекты по одному", т.е. каждый вызов next() формирует запрос к базе на пересылку следующей строки. Но это будет очень медленно. Это сообщение отредактировал(а) COVD - 28.1.2010, 23:45 |
|||
|
||||
| magicfly |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 21.2.2007 Репутация: нет Всего: 1 |
если Вы хотите делать ограниченный поиск тогда надо ставить лимиты на скл запрос. criteria.scroll() позволяет лишь выгружать инфу по частям
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В ResultSet может быть предусмотрено и скролирование в обе стороны, но в тех СУБД которые не поддерживают двунаправленные курсоры, это будет делаться за счет буфера в памяти.
-------------------- 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. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |