Hibernate: неожиданный порядок выборки для пакетной выборки - PullRequest
1 голос
/ 09 ноября 2010

Я использую пакетную загрузку hibernate для повышения производительности запросов. В моем файле persistence.xml я добавил следующий параметр:

<property name="hibernate.default_batch_fetch_size" value="50"/>

У меня есть объект A, который имеет отношение 1: n к объекту B. Данные для этого отношения выбираются лениво. Теперь у меня следующая ситуация:

  • Я загружаю 10000 объектов типа A из БД
  • Я перебираю эти сущности и инициализирую ленивое отношение, вызывая a.getBs (). Size ()
  • При этом hibernate не только инициализирует зависимость для текущего объекта, но и дополнительно загружает зависимость для 49 дополнительных объектов из списка. Такое поведение ожидается.

Сгенерированный SQL выглядит примерно так:

select
    b0_.SOMETHING as SOMETHING1_1_,
    ...
from
    XYZ.B b0_ 
where
    b0_.A_ID in (
        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ...
    ) 

Моя настоящая проблема в том, что hibernate не загружает объекты списка результатов в ожидаемом порядке. Когда я получаю доступ к первой записи из списка, она не загружает данные для сущностей 2-50, но загружает данные для 49 случайных записей из списка. (например, он может инициализировать данные объектов 3, 7, 100, 2001, ...). Такое поведение довольно странно, и мне интересно, как изменить его, чтобы загрузить данные в ожидаемом порядке.

Текущие проблемы, связанные с описанным поведением.

  • Использование памяти. При переборе списка Hibernate инициализирует много данных, которые потребуются НАМНОГО позже. В дополнение к описанному выше алгоритму я добавил некоторый код, который удаляет обработанные записи из списка и вызывает session.evict (entity), чтобы сделать объект соответствующим для сбора мусора. Это, конечно, не работает сейчас.
  • Скорость запроса очень низкая в начале итерации, так как hibernate запрашивает базу данных почти для каждого обработанного объекта. Это вызывает проблемы, поскольку я записываю сущности в поток веб-приложения для загрузки во время обработки. В результате скорость загрузки вначале очень низкая и увеличивается, когда в память загружено больше сущностей и требуется меньше вызовов БД.

Большое спасибо за вашу помощь и наилучшие пожелания

Thomas

1 Ответ

2 голосов
/ 09 ноября 2010

Когда вы говорите, что Hibernate не загружает сущности в ожидаемом порядке, вы сказали ему, что это за ожидаемый порядок?То есть содержит ли отображение для B s атрибут order-by?Если нет, то они не имеют порядка в модели данных Hibernate и могут быть загружены в любом порядке (вероятно, в базе данных по умолчанию).

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

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