# Virtual Thread Veritabanı Kapasitesini Artırmaz: JDBC Bağlantı Havuzunun Sınırı

> Java virtual thread sayısı ile eşzamanlı JDBC işlem kapasitesinin neden aynı şey olmadığını; HikariCP, backpressure ve kuyruk gecikmesi üzerinden ele alan kapasite notu.

- Author: Muhammet Ali Köker
- Language: tr
- Canonical: https://alikoker.com.tr/virtual-thread-jdbc-baglanti-havuzu-kapasite-siniri
- Translation: https://alikoker.com.tr/en/virtual-threads-jdbc-connection-pool-capacity-boundary
- Published: 2026-09-02T18:34:00+03:00
- Modified: 2026-09-02T18:34:00+03:00
- Verified: 2026-09-02T18:34:00+03:00
- Type: article

Virtual thread, bekleyen I/O ağırlıklı Java iş yüklerinde platform thread maliyetini ciddi biçimde azaltır. Fakat uygulamanın daha fazla eşzamanlı işi ifade edebilmesi, aşağıdaki sistemlerin aynı oranda kapasite kazandığı anlamına gelmez. Özellikle veritabanı bağlantısı sınırlı ve pahalı bir kaynaktır.

Basit ayrım şudur:

```text
çok sayıda virtual thread
        ≠
aynı sayıda JDBC connection
        ≠
aynı sayıda verimli eşzamanlı SQL
```

## Connection pool bir admission-control sınırıdır

Bir isteğin virtual thread üzerinde ucuz biçimde bekleyebilmesi yararlıdır. Buna karşılık her isteğe ayrı JDBC bağlantısı vermek Oracle oturumu, PGA, cursor, lock, I/O ve CPU tarafındaki maliyetleri büyütür. Bu nedenle HikariCP gibi bir pool yalnız bağlantı tekrar kullanım mekanizması değil, veritabanına aynı anda kaç işin gireceğini sınırlayan bir admission-control noktasıdır.

Pool dolduğunda bekleyen virtual thread'ler platform thread tüketmeden park edebilir. Bu davranış, pool'u gereksiz büyütmek için değil, sınırlandırılmış kıt kaynağın önünde daha ucuz beklemek için değerlidir.

## Thread sayısından pool boyutu türetilmez

`maximumPoolSize = virtualThreadCount` biçiminde bir ilişki yoktur. Pool kapasitesi; veritabanının sürdürülebilir aktif sorgu sayısı, transaction süresi, SQL karışımı, I/O davranışı ve uygulamanın latency hedefi üzerinden ölçülmelidir.

Aşırı büyük pool şu belirtileri üretebilir:

- daha fazla aktif Oracle oturumu,
- CPU run queue büyümesi,
- disk veya ağ I/O kuyruğu,
- lock contention,
- buffer-cache baskısı,
- ortalama latency kabul edilebilirken p95/p99 değerlerinin bozulması.

Kapasite ararken yalnız throughput'a bakmak bu nedenle yetersizdir. En azından connection acquisition time, active/idle/pending connection sayıları, transaction süresi, veritabanı wait event'leri ve tail latency birlikte izlenmelidir.

## Backpressure nerede uygulanır?

Virtual threads, “her şeyi sınırsız başlat” anlamına gelmez. Sistemin kıt kaynağı veritabanıysa backpressure bu kaynağın önünde görünür olmalıdır. JDBC pool bekleme kuyruğu bunu doğal olarak yapabilir; fakat kuyruk sonsuza kadar büyümemelidir. İstek zaman aşımı, bounded admission veya upstream rate limiting ile sistemin taşıyamadığı yük açıkça reddedilebilmelidir.

Bu ayrım latency ile throughput arasındaki ilişkiyi de açıklar. Pool'u büyütmek kısa süre için daha çok sorguyu aynı anda başlatabilir; fakat veritabanı doygunsa her sorgu daha uzun sürer. Sonuçta tamamlanan iş miktarı artmadan kuyruk ve tail latency büyüyebilir.

## Java sürüm ayrıntısı

Virtual threads JDK 21 ile kalıcı özellik oldu. Daha sonraki JVM geliştirmeleri, özellikle `synchronized` kullanımıyla ilişkili pinning davranışını azaltmıştır. Bu iyileştirmeler uygulama tarafındaki thread kullanımını değiştirir; veritabanının fiziksel kapasite sınırını kaldırmaz.

## Ölçmeden sayı seçmemek

Sağlıklı pool boyutu tek formülle bulunmaz. Aynı donanımda kısa OLTP sorguları ile uzun rapor sorgularının ideal eşzamanlılığı farklıdır. Ayrı iş yükleri ciddi biçimde farklı service-time dağılımlarına sahipse ayrı havuz veya ayrı admission policy gerekebilir.

İlişkili içerikler: [Java Tabanlı Veri Sistemlerinde Yüksek Başarım](/java-tabanli-veri-sistemlerinde-yuksek-basarim), [Connection Pool](/wiki/connection-pool), [Virtual Thread](/wiki/virtual-thread), [Backpressure](/wiki/backpressure), [Tail Latency](/wiki/tail-latency).

## Kaynaklar

- OpenJDK JEP 444 — Virtual Threads
- OpenJDK JEP 491 — Synchronize Virtual Threads without Pinning
- HikariCP Wiki — About Pool Sizing

## Bu Çalışmaya Atıf

Köker, M. A. (2026). Virtual Thread Veritabanı Kapasitesini Artırmaz: JDBC Bağlantı Havuzunun Sınırı. alikoker.com.tr. https://alikoker.com.tr/virtual-thread-jdbc-baglanti-havuzu-kapasite-siniri

- BibTeX: https://alikoker.com.tr/virtual-thread-jdbc-baglanti-havuzu-kapasite-siniri.bib
- RIS: https://alikoker.com.tr/virtual-thread-jdbc-baglanti-havuzu-kapasite-siniri.ris
- CSL-JSON: https://alikoker.com.tr/virtual-thread-jdbc-baglanti-havuzu-kapasite-siniri.csl.json
