Junior — Middle
Μπορείς να δώσεις ένα παράδειγμα εμφάνισης του προβλήματος N+1 κατά τη χρήση του Hibernate;
sobes.tech AI
Απάντηση από AI
Το πρόβλημα N+1 προκύπτει όταν, κατά τη φόρτωση μιας συλλογής σχετικών οντοτήτων, το Hibernate εκτελεί ένα ερώτημα για την κύρια οντότητα (N) και στη συνέχεια ένα ξεχωριστό ερώτημα για κάθε σχετική οντότητα (+1 για κάθε μία). Για παράδειγμα, υπάρχει μια οντότητα Author με μια συλλογή books:
List<Author> authors = session.createQuery("from Author").list();
for (Author author : authors) {
System.out.println(author.getBooks().size()); // Με lazy loading, θα εκτελεστεί ένα ξεχωριστό ερώτημα για κάθε βιβλίο
}
Εδώ, αρχικά εκτελείται ένα ερώτημα για να πάρει όλους τους συγγραφείς, και στη συνέχεια, για κάθε συγγραφέα, ένα ξεχωριστό ερώτημα για να φορτώσει τα βιβλία. Αυτό οδηγεί σε πολλά ερωτήματα και μειώνει την απόδοση.
Για να αποφύγετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε το fetch join:
List<Author> authors = session.createQuery("select a from Author a join fetch a.books").list();
Αυτό θα φορτώσει τους συγγραφείς και τα βιβλία τους με ένα μόνο ερώτημα.