SQL Server Bağlantı Havuzu Timeout: Sorgu mu Yavaş, Havuz mu Tükendi?
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Timeout expired. The timeout period elapsed prior to obtaining a connection
from the pool. This may have occurred because all pooled connections were in
use and max pool size was reached.İki kritik hata mesajını birbirinden ayırın:
- •`Timeout expired prior to obtaining a connection from the pool`: Havuzda boş bağlantı yok (Uygulama tarafı sızıntı / blokaj).
- •`Execution Timeout Expired`: Sorgu belirtilen sürede bitmedi (Sorgu optimizasyonu / kilit).
▸Adım adım teşhis
1. Sunucu tarafında oturum dağılımı:
SELECT login_name, program_name, COUNT(*) AS oturum
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
GROUP BY login_name, program_name
ORDER BY oturum DESC;2. Boşta oturan mı, çalışan sorgular mı?
SELECT s.session_id, s.login_name, s.status, s.host_name,
r.status AS istek_durumu, r.wait_type,
r.total_elapsed_time / 1000 AS saniye,
SUBSTRING(t.text, 1, 200) AS sorgu
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON r.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE s.is_user_process = 1
ORDER BY r.total_elapsed_time DESC;s.status = 'sleeping' ağırlıklıysa sızıntı; r.status = 'running' ağırlıklıysa yavaş sorgu veya blokaj vardır.
3. Blokaj zinciri kontrolü:
SELECT blocking_session_id, session_id, wait_type,
wait_time / 1000 AS bekleme_sn, wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;▸Kalıcı Çözüm (.NET & Mimari)
- •DbContext ömrü: Asla
Singletonolmamalıdır; her HTTP isteğine özelScopedyaşamalıdır. - •Dispose garantisi:
await usingveyausingblokları ile bağlantılar kesin kapatılmalıdır. - •Havuz Boyutu Formülü:
toplam bağlantı = pod sayısı × Max Pool Size × (1 + eşzamanlı payı)Örnek: 4 pod × 100 = 400 bağlantı; 200 worker thread'lik sunucuyu kilitler. Havuzu büyütmek yerine küçültüp sorguları hızlandırın.
▸İlgili Mühendislik Rehberleri ve İç Linkler
- •SQL Server Login Failed (Error 18456)
- •SQL Server Deadlock (Error 1205)
- •Test edilen sürümler: SQL Server 2019 / 2022
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL too many clients already Hatası: 6 Adımda Çözüm
FATAL: sorry, too many clients already hatasının üç nedeni, nedeni ayırt eden tek sorgu ve max_connections ile PgBouncer üzerinden kalıcı çözümü.
PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.