Вызов Hibernate хранимой процедуры приводит к OutOfMemory - PullRequest
0 голосов
/ 14 августа 2011

Я использую именованный запрос Hibernate для выполнения хранимой процедуры, возвращающей очень большой набор данных (более 2 миллионов строк). БД - Oracle 11g

например: Query query = session.getNamedQuery(procName);

Я знаю из документации по спящему режиму, вы не можете использовать setFirstResult / setMaxResult, как указано на http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html.

Все хорошо, на меньшем наборе данных, таком как 100 000 строк. Однако, как только я тестирую с 1 000 000, я получаю ошибку OutOfMemory.

Из объекта запроса я получаю listIterator. Я предположил, что данные были получены только один раз, я перебираю список (query.list().listIterator())

У меня не настроен кэш 2-го уровня. Помогут ли эти настройки при работе с хранимой процедурой Oracle.

query.setCacheMode(org.hibernate.CacheMode.IGNORE); query.setFetchSize(1000);<br> query.scroll(org.hibernate.ScrollMode.FORWARD_ONLY);

По сути, как мне управлять извлечением больших наборов данных, используя хранимые процессы в Hibernate.

Миллион благодарностей

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Это полностью зависит от того, как вы обрабатываете данные, полученные из запроса.Если вы обрабатываете его как типичный запрос - то есть вызываете list () для него и сохраняете результат в Collection - тогда вы собираетесь разрушить свой предел памяти таким количеством строк.Ключ должен получить и обработать их партиями.Я считаю, что типичный способ сделать это с помощью Hibernate - это получать результаты в виде ScrollableResults и помнить flush () и clear () сеанс периодически, так как ондействует как кэш первого уровня и будет хранить все загружаемые объекты.Посмотрите на описания пакетной обработки в Hibernate, но будьте осторожны, чтобы не перепутать с пакетной выборкой Hibernate и смежными концепциями.Это два разных животных.

0 голосов
/ 14 августа 2011

Ваша проблема связана не столько с Hibernate, сколько с использованием памяти.У меня была похожая ситуация, когда сообщение JMS работало нормально с небольшим количеством данных, а затем все взорвалось с большим.Поскольку я сомневаюсь, что вам нужны все 2-миллиметровые записи в памяти одновременно, посмотрите, сможете ли вы обновить сохраненный процесс так, чтобы он принимал ограничение и смещение, чтобы он мог возвращать фрагменты данных, а не только весь набор данных.

...