Hibernate 1st Level vs 2nd Level Cache & N+1 Çözümü
Aynı nesneyi aynı transaction içinde veritabanından tekrar tekrar sormayı önleyen tampon bellek.
1st Level Cache: Masanda önünde açık duran defterdir (aynı oturumda ona bakarsın). 2nd Level Cache: Şirketin ortak arşiv odasıdır (tüm çalışanlar oradaki ortak kopyayı okur).
First-Level Cache Hibernate Session bazlıdır ve kapatılamaz; aynı transaction içindeki aynı ID'li entity veritabanına gitmeden belleğe döner. Second-Level Cache ise SessionFactory bazlı olup tüm uygulama genelinde paylaşılır (Redis, Hazelcast, Ehcache entegre edilir).
“1st level cache Session seviyesinde varsayılan açıktır. N+1 sorununu çözmek için JPQL JOIN FETCH veya @EntityGraph kullanılır. Dağıtık mimarilerde okuma performansını uçurmak için 2nd level cache (Ehcache/Redis) devreye alınır.”
@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.active = true")
List<User> findAllActiveWithOrders(); // N+1 sorgusunu 1 tek JOIN'e indirir!
FetchType.EAGER kullanarak her ilişkide gereksiz devasa tabloları JOIN yapmak. Standart her zaman FetchType.LAZY olmalıdır.