ЗдесьАвтор: 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 должен помочь, однако он возвращает результат в неудобном формате.