Gökmen Tuksavul

Blog Yazısı

2026-03-02

Spring Boot API Performans Notları

Spring Boot projelerinde API performansını artırmak için SQL optimizasyonu, Hibernate L2 cache, Redis ve bağlantı havuzu ayarları gibi kritik backend tekniklerini öğrenin.

Spring BootAPIPerformance

Sponsorlu

Modern web uygulamalarında performans, sadece kodun hızı değil, aynı zamanda sistem kaynaklarının verimli kullanımıdır. Özellikle yüksek trafikli mikroservis mimarilerinde, yanlış yapılandırılmış bir veritabanı bağlantı havuzu veya optimize edilmemiş sorgular tüm sistemi kilitleyebilir. Bu yazıda, üretim ortamında edindiğim tecrübelerle Spring Boot API performansını nasıl optimize edebileceğinizi adım adım inceleyeceğiz.

1. Veritabanı Bağlantı Yönetimi ve HikariCP

Spring Boot varsayılan olarak HikariCP bağlantı havuzunu kullanır. HikariCP, hızıyla bilinse de varsayılan ayarlar her zaman ideal değildir. maximum-pool-size değerini çok yüksek tutmak CPU üzerinde context switching maliyetini artırırken, çok düşük tutmak isteklerin kuyrukta beklemesine ve timeout hatalarına neden olur.

İpucu: Havuz boyutunu belirlemek için şu formülü baz alabilirsiniz: connections = ((core_count * 2) + effective_spindle_count).

Örnek optimize edilmiş yapılandırma: ``yaml spring.datasource.hikari: maximum-pool-size: 15 minimum-idle: 5 idle-timeout: 300000 connection-timeout: 20000 max-lifetime: 1800000 ``

2. Hibernate N+1 Problemi ve EntityGraph Çözümü

Birçok geliştirici farkında olmadan ilişkili dataları çekerken onlarca gereksiz sorgu atılmasına (N+1 problemi) neden olur. Örneğin, 10 tane 'Post' nesnesini çekerken her birinin 'Author' bilgisini ayrı sorgularla çekmek ciddi bir gecikmeye yol açar.

@OneToMany ilişkilerde FetchType.LAZY kullanmak yetmez; sorgu anında JOIN FETCH veya JPA 2.1 ile gelen @EntityGraph kullanarak bu sorunu çözmelisiniz. Bu yaklaşım, DB tur sayısını 11'den (1 ana sorgu + 10 alt sorgu) 1'e indirebilir.

@EntityGraph(attributePaths = {"authors", "comments"})
List<Post> findAllByPublishedTrue();

3. Redis ile Dağıtık Önbellekleme (Distributed Caching)

Sık değişmeyen ancak hesaplaması veya getirilmesi maliyetli veriler (örneğin ürün kategorileri veya döviz kurları) için uygulama içi cache yerine Redis gibi dağıtık çözümler kullanılmalıdır. Spring Cache soyutlaması sayesinde @Cacheable anotasyonu ile servis katmanınızı kolayca hızlandırabilirsiniz.

Dikkat Edilmesi Gerekenler: - TTL (Time To Live): Verinin ne kadar süre cache'te kalacağını iş mantığınıza göre belirleyin. - Cache Eviction: Veri güncellendiğinde cache'in temizlendiğinden emin olun (@CacheEvict).

4. Gözlemlenebilirlik (Observability)

Neyi ölçemezseniz onu optimize edemezsiniz. Spring Boot Actuator, Micrometer ve Prometheus üçlüsü ile uygulamanızın anlık CPU, bellek ve HTTP istek sürelerini takip edin. Grafana üzerinde oluşturacağınız dashboard'lar, darboğazları kullanıcılarınız fark etmeden önce sizin görmenizi sağlar.

Sonuç

Performans optimizasyonu bir varış noktası değil, sürekli devam eden bir yolculuktur. Uygulamanız büyüdükçe yük testleri (JMeter, K6) yaparak zayıf halkaları tespit etmeli ve yukarıdaki teknikleri uygulamalısınız.