Sobes.tech
Junior — Middle

Hibernate istifadə edərkən N+1 probleminin yaranmasına nümunə göstərə bilərsənmi?

sobes.tech Süni İntellekt

AI-dan cavab

N+1 problemi, əlaqəli varlıqlar kolleksiyasını yükləyərkən yaranır, çünki Hibernate əsas varlıq üçün (N) sorğu icra edir və sonra hər əlaqəli varlıq üçün ayrıca (+1) sorğu göndərir. Məsələn, Author varlığı və onun books kolleksiyası olsun:

List<Author> authors = session.createQuery("from Author").list();
for (Author author : authors) {
    System.out.println(author.getBooks().size()); // Tələsmə yükləmə ilə, hər kitab üçün ayrıca sorğu göndəriləcək
}

Burada əvvəlcə bütün müəllifləri almaq üçün sorğu icra olunur və sonra hər müəllif üçün kitabları yükləmək üçün ayrıca sorğu göndərilir. Bu çox sayda sorğuya və performansın azalmasına səbəb olur.

Bu problemi həll etmək üçün fetch join istifadə etmək olar:

List<Author> authors = session.createQuery("select a from Author a join fetch a.books").list();

Bu, müəllifləri və onların kitablarını tək sorğu ilə yükləməyə imkan verir.