Hibernate: Избегайте чтения всех записей в память сразу - PullRequest
6 голосов
/ 16 ноября 2008

У меня есть большое количество строк в базе данных, из которых мне нужно создать XML-документ. Я использую hibernate 3. Базовый метод list () в интерфейсах Criteria и Query выглядит опасно: я уверен, что он должен читать все записи в памяти, даже если я только перебираю их. Или есть какая-то ленивая магия загрузки? Если нет, мне кажется, что у меня осталось два варианта: использование scroll () или iterate () из Query (scroll также присутствует в Criteria). Итерация тоже выглядит не очень хорошо, если я хочу иметь минимальные циклические обращения SQL: «Первый запрос SQL возвращает только идентификаторы». Так что я прав, нужно ли для этого использовать scroll ()?

Ответы [ 5 ]

3 голосов
/ 23 ноября 2010

Попробуйте использовать scroll () в сочетании с этим:

http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/StatelessSession.html

Командно-ориентированный API для выполнения массовых операций с базой данных.

Сеанс без сохранения состояния не реализует кэш первого уровня, не взаимодействует с каким-либо кешем второго уровня, не реализует транзакционную запись с обратной записью или автоматическую грязную проверку, а также каскадные операции с ассоциированными экземплярами. Коллекции игнорируются сеансом без сохранения состояния. Операции, выполняемые через сеанс без сохранения состояния, обходят модель событий и перехватчики Hibernate. Сеансы без сохранения состояния уязвимы к эффектам наложения данных из-за отсутствия кэша первого уровня.

Для определенных типов транзакций сеанс без сохранения состояния может выполняться немного быстрее, чем сеанс с сохранением состояния.

1 голос
/ 19 августа 2009

Если вам не нужно помечать объекты как обработанные, вы можете просто использовать scroll () и исключать объекты из сеанса, как вы сделали с ними.

1 голос
/ 16 ноября 2008

Используйте метод setMaxResults () для критериев.

Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(maxResults);
crit.setFirstResult(firstResultIndex);
List cats = crit.list();

http://hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

0 голосов
/ 13 августа 2009

Вот что я планирую сделать: Создайте временную таблицу с идентификаторами объектов всех строк, которые нужно экспортировать:

Insert into BatchTable (ID, Seq) Select (O.ID, Sequence.Next) 
From MyObject O Where ...

В небольших единицах нагрузки нагрузки на объекты:

Select Min(B.Seq), Max(B.Seq) From BatchTable;

for (batch = minBatch; batch <= maxBatch; batch += size) {
 beginTransaction();
 results = query("Select O From MyObject O, BatchTable B 
                  Where O.ID = B.ID and (? <= B.Seq AND B.Seq < ?)");

 exportXML(results);
 for (MyObject O : results) {
  O.setProcessed(True);
  O.update();
 }
 commit();
}
0 голосов
/ 16 ноября 2008

Кроме того, взгляните на пакетную загрузку, которую следует выполнить в разделах 19.1.4 и 19.1.5. http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#queryhql-joins-forms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...