Использование ScrollableResults Hibernate для медленного чтения 90 миллионов записейJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Использование ScrollableResults Hibernate для медленного чтения 90 миллионов записей

Сообщение Anonymous »

Мне просто нужно прочитать каждую строку таблицы в моей базе данных MySQL с помощью Hibernate и написать на ее основе файл. Но строк 90 миллионов, и они довольно большие. Поэтому мне показалось, что будет уместно следующее:

Код: Выделить всё

ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
Проблема в том, что приведенный выше пример попытается загрузить все 90 миллионов строк в оперативную память, прежде чем перейти к циклу while... и это убьет мою память с помощью OutOfMemoryError: Java исключения кучи :(.

Полагаю, ScrollableResults - это не то, что я искал? Как правильно с этим справиться? Я не возражаю, если это цикл while занимает несколько дней (ну, мне бы это понравилось нет).

Я думаю, единственный другой способ справиться с этим — использовать setFirstResult и setMaxResults для перебора результатов и просто использовать обычные результаты Hibernate вместо ScrollableResults. Однако кажется, что это будет неэффективно и займет смехотворно много времени, когда я вызываю setFirstResult в 89-миллионной строке...

ОБНОВЛЕНИЕ: setFirstResult/setMaxResults не работает, оказывается, что получение смещений занимает неприемлемо много времени, как я и боялся. Здесь должно быть решение! Разве это не довольно стандартная процедура?? и используйте JDBC или что-то еще.

ОБНОВЛЕНИЕ 2: решение, которое я придумал, работает нормально, не очень хорошо, в основном форма:

Код: Выделить всё

select * from person where id >  and  limit 1
Поскольку у меня есть другие условия, даже все в индексе, это все равно не так быстро, как мне хотелось бы... поэтому я открыт для других предложений. .

Подробнее здесь: https://stackoverflow.com/questions/282 ... on-records
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»