BOOKJAVA Telegram 3827
Как не завалить приложение из-за N+1 запросов в Hibernate 🧨

N+1 проблема — больной зуб почти любого Java-разработчика. Hibernate делает жизнь проще, пока не сталкиваешься с этим 👻

📌 Суть проблемы
Допустим, у тебя есть сущности User и связанные с ними сущности Order. При запросе пользователей:


List<User> users = userRepository.findAll(); // Один запрос
for(User user : users) {
List<Order> orders = user.getOrders(); // +1 запрос на каждого пользователя!
}


Если пользователей 1000, то будет 1 + 1000 SQL-запросов. Это убийственно для производительности ⚠️

🛠 Как решить?

💡 Вариант 1: JOIN FETCH
Самый быстрый и простой путь — сразу подтянуть связанные сущности:


@Query("SELECT u FROM User u JOIN FETCH u.orders")
List<User> findAllWithOrders();


Всего один SQL-запрос
Может привести к дублированию строк, если связей много и они сложные

💡 Вариант 2: Entity Graph (Spring Data JPA)
Entity Graph — более гибкий подход:


@EntityGraph(attributePaths = {"orders"})
List<User> findAll();


Удобно и понятно, нет дублей
Можно легко настраивать под конкретный запрос

💡 Вариант 3: Batch fetching (настройка Hibernate)


spring.jpa.properties.hibernate.default_batch_fetch_size=20


Hibernate будет автоматически загружать связанные сущности пачками.

Просто настроить и сразу эффект
Всё равно несколько запросов, хотя и пачками

🧠 Когда что использовать?

▫️ JOIN FETCH — когда связи простые, а данных немного.

▫️ Entity Graph — если нужна гибкость и удобство.

▫️ Batch fetching — когда настроить проще, чем переписывать код.

Не забывай проверять SQL-запросы в логах и профилировать приложение 🔥

👉@BookJava
👍7



tgoop.com/BookJava/3827
Create:
Last Update:

Как не завалить приложение из-за N+1 запросов в Hibernate 🧨

N+1 проблема — больной зуб почти любого Java-разработчика. Hibernate делает жизнь проще, пока не сталкиваешься с этим 👻

📌 Суть проблемы
Допустим, у тебя есть сущности User и связанные с ними сущности Order. При запросе пользователей:


List<User> users = userRepository.findAll(); // Один запрос
for(User user : users) {
List<Order> orders = user.getOrders(); // +1 запрос на каждого пользователя!
}


Если пользователей 1000, то будет 1 + 1000 SQL-запросов. Это убийственно для производительности ⚠️

🛠 Как решить?

💡 Вариант 1: JOIN FETCH
Самый быстрый и простой путь — сразу подтянуть связанные сущности:


@Query("SELECT u FROM User u JOIN FETCH u.orders")
List<User> findAllWithOrders();


Всего один SQL-запрос
Может привести к дублированию строк, если связей много и они сложные

💡 Вариант 2: Entity Graph (Spring Data JPA)
Entity Graph — более гибкий подход:


@EntityGraph(attributePaths = {"orders"})
List<User> findAll();


Удобно и понятно, нет дублей
Можно легко настраивать под конкретный запрос

💡 Вариант 3: Batch fetching (настройка Hibernate)


spring.jpa.properties.hibernate.default_batch_fetch_size=20


Hibernate будет автоматически загружать связанные сущности пачками.

Просто настроить и сразу эффект
Всё равно несколько запросов, хотя и пачками

🧠 Когда что использовать?

▫️ JOIN FETCH — когда связи простые, а данных немного.

▫️ Entity Graph — если нужна гибкость и удобство.

▫️ Batch fetching — когда настроить проще, чем переписывать код.

Не забывай проверять SQL-запросы в логах и профилировать приложение 🔥

👉@BookJava

BY Библиотека Java разработчика




Share with your friend now:
tgoop.com/BookJava/3827

View MORE
Open in Telegram


Telegram News

Date: |

Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. How to create a business channel on Telegram? (Tutorial) How to Create a Private or Public Channel on Telegram? Hui said the messages, which included urging the disruption of airport operations, were attempts to incite followers to make use of poisonous, corrosive or flammable substances to vandalize police vehicles, and also called on others to make weapons to harm police. The Standard Channel
from us


Telegram Библиотека Java разработчика
FROM American