Оптимизация hibernate-коллекций
От: dimok@  
Дата: 09.06.07 08:10
Оценка:
Здесь
Автор: unkis
Дата: 07.06.07
обсуждают производительность больших апдейтов. Хотелось бы рассмотреть и вопрос больших выборок.
    Criteria criteria = session.createCriteria(Some.class);
    criteria.setFetchSize(1000);
    List<Some> entries = (List<Some>) criteria.list();
    for (Some entry : entries)
    {
        // делаем нечто
    }

При этом похоже выборка в процессе обработки таки закачивается целиком в память. Профайлером пока не смотрел, каюсь (нету дома), но, судя по запросам этого куска во время выполнения (хотелось уменьшить -Xmx, чтобы не платить много хостеру), аппетит кода несравнимо больше, чем 1000 записей. Внутри цикла формируется ByteArrayOutputStream с итоговым размером < 10М, а выполнение кода требует 320М (записей в выборке ~100000).
В hibernate.cfg.xml установлено <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>. Код выполняется под Tomcat.
Вроде criteria.scroll должен помочь, однако он возвращает результат в неудобном формате.
Re: Оптимизация hibernate-коллекций
От: GarryIV  
Дата: 09.06.07 14:32
Оценка:
Здравствуйте, dimok@, Вы писали:

D>Здесь
Автор: unkis
Дата: 07.06.07
обсуждают производительность больших апдейтов. Хотелось бы рассмотреть и вопрос больших выборок.

D>
D>    Criteria criteria = session.createCriteria(Some.class);
D>    criteria.setFetchSize(1000);
D>    List<Some> entries = (List<Some>) criteria.list();
D>    for (Some entry : entries)
D>    {
D>        // делаем нечто
D>    }
D>

D>При этом похоже выборка в процессе обработки таки закачивается целиком в память. Профайлером пока не смотрел, каюсь (нету дома), но, судя по запросам этого куска во время выполнения (хотелось уменьшить -Xmx, чтобы не платить много хостеру), аппетит кода несравнимо больше, чем 1000 записей. Внутри цикла формируется ByteArrayOutputStream с итоговым размером < 10М, а выполнение кода требует 320М (записей в выборке ~100000).
D>В hibernate.cfg.xml установлено <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>. Код выполняется под Tomcat.
D>Вроде criteria.scroll должен помочь, однако он возвращает результат в неудобном формате.

А как насчет setFirstResult и setMaxResults + цикл (если помнишь у нас такое было в BeanQuery )? Плюс можно использовать stateless session она никаких entity в себе не хранит.
WBR, Igor Evgrafov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.