Почему бы мне не использовать @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
экземпляры в сеансе без выгоды - они никогда не будут использованы.