Я использую пакетную загрузку 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