Fix N+1 Query Performance Issue in /vets.html Endpoint #108
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Critical N+1 query performance issue detected in the
/vets.html
endpoint causing 5 repeated database queries per request.Issue ID: e8efc2b4-5f5e-11f0-bbd9-0242ac160009
Affected Endpoint: HTTP GET /vets.html
Service: spring-petclinic
Trace ID: E78ADC1B4AB172AAA6DAC2D716CB4E0D
Solution
Implemented eager fetching with JOIN FETCH to resolve the N+1 query pattern by:
1. VetRepository Changes
findAllWithSpecialties()
method with@Query("SELECT v FROM Vet v LEFT JOIN FETCH v.specialties")
findAllWithSpecialties(Pageable pageable)
for the HTML endpoint@Transactional(readOnly = true)
and@Cacheable("vets")
to maintain existing behavior2. VetController Changes
findPaginated()
method to usefindAllWithSpecialties(pageable)
instead offindAll(pageable)
showResourcesVetList()
method to usefindAllWithSpecialties()
instead offindAll()
Impact
Testing
The changes maintain backward compatibility and preserve all existing functionality while optimizing database queries.