Почему бы мне не использовать @BatchSize в каждом загруженном ленивом отношении?

Аннотация @BatchSize hibernate позволяет получать пакетную загрузку объектов с отложенной загрузкой. Например, если я получил что-то вроде:

public class Product {


    @OneToMany(fetchType=LAZY)
    @BatchSize(size=10)
    private ProductCategory category;

}

Теперь, если я получу категорию продукта, Hibernate получит категории еще до десяти продуктов, которые находятся в текущем сеансе и еще не инициализированы в поле категории. Это экономит тонну вызовов SQL в базе данных. Все идет нормально. Теперь мне интересно, почему бы мне не использовать аннотацию @BatchSize для КАЖДОГО лениво загруженного отношения? В конце концов, зачем мне дополнительные звонки в базу данных? Очевидно, для этого должна быть причина, иначе ребята из Hibernate могли бы сделать это по умолчанию, но в настоящее время я не вижу этого.

2 ответа

Решение

Я не собираюсь отвечать на ваш вопрос напрямую, но я собираюсь ответить на более общий вопрос, который может быть следующим: "Я нашел что-то, что работает для меня быстрее, почему бы не применить его везде?"

Краткий ответ: вы не должны делать упреждающую оптимизацию.

hibernate - это замечательный ORM, который допускает все виды оптимизации. Вы должны измерить все процессы, которые вызывают проблему (классический N+1, даже если это быстро, любые медленные процессы и т. Д.) И оптимизировать для ее решения.

Вы можете значительно повысить производительность, загружая некоторые свойства, потому что вы всегда используете их, вам может понадобиться BatchSize 100 для другого, потому что вы знаете, что это количество отношений, которые вы имеете для этого свойства.

В конечном счете, вы не должны заботиться об оптимизации, если вам не нужно заботиться об этом. И вам нужно заботиться, когда вы сделали измерения и обнаружили проблемы.

почему бы мне не использовать аннотацию @BatchSize в КАЖДОЙ лениво загруженной взаимосвязи?

Потому что это оптимизация, которая вам может не понадобиться в каждом конкретном случае. Пакетная загрузка, как это полезно, когда ваше приложение собирается получить доступ product.category для многих разных productsтак что вы можете иметь один select from category... запрос выполнен, а не N из них.

Однако, что если, когда ваше приложение получает доступ product.category для одного Product Например, вряд ли доступ к category поле другого Product экземпляры в одном сеансе? Если у вас есть @BatchSize включен для этой ассоциации, то вы только что загрузили ряд других Category экземпляры в сеансе без выгоды - они никогда не будут использованы.

Другие вопросы по тегам