2014-12-18 2 views
0

Я ищу, чтобы работать с hibernate pagination в sybase, но так как Sybase не имеет встроенного смещения, Hibernate пытается получить все записи в памяти и прокручивается до конкретной записи задать запрос и отправить его в интерфейс.
Скажите, например, если полные строки равны 1000, и я запрашиваю 20 записей на стр. 2. Hibernate-запрос извлекает все записи в память и прокручивает с 21 до 40 и возвращает только эти 20 строк.Hibernate Pagination с Sybase ASE - пустое пространство

Этот материал отлично подходит для меньшего количества записей, но когда мы имеем дело с чем-то более чем 1 миллионным записями, тогда его излучаем проблему outofmemory-heap space.

Это узкое место производительности, связанное с памятью.
Я занимаюсь серфингом через интернет с 2-3 дней, но без везения. И я уверен, что многие люди будут сталкиваться с этой проблемой.

Не могли бы вы что-нибудь предложить?

Спасибо!

+0

Можете ли вы вставить свой код, который выполняет запрос на спящий режим? Используете ли вы функцию прокручиваемого результирующего набора для спящего режима для извлечения записей партиями? –

+0

@AndyDufresne Нет, я не использую прокручиваемый результат, но setFirstResults и setMaxResults. i.e, query.setFirstResult (начало); query.setMaxResults (nRows); в другом контексте, есть ли пакетная обработка с прокручиваемыми результатами? – Faz

+0

и его просто выберите запрос из таблицы. – Faz

ответ

1

Ниже приведен один из способов чтения больших наборов результатов в спящем режиме.

Query query = session.createQuery(query); 
query.setReadOnly(true); 
// MIN_VALUE gives hint to JDBC driver to stream results 
query.setFetchSize(Integer.MIN_VALUE); 
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); 
// iterate over results 
while (results.next()) { 
    Object row = results.get(); 
    // process row then release reference 
    // you may need to flush() as well 
} 
results.close(); 

this ссылка для получения более подробной информации.

+0

Энди, не означает ли это, что соединение будет открыто до тех пор, пока мы не прочтем все строки? Скажем, например, если у нас есть миллион строк для чтения, если соединение не будет открыто до тех пор, пока вы не обработаете запись? И, наоборот, это повлияет на память jvm для больших результирующих наборов, ведущих к outofmemory вопросам? – Faz

+0

Это будет поддерживать соединение открытым, но поскольку оно не загружает все записи в памяти, это, безусловно, не приведет к проблемам OOM. –