Soru: SambaPOS da ‘Timeout Expired. The Timeout Period Elapsed Prior to Obtaining a Connection From the Pool’ Hatası Neden Çıkar?
Cevap: Restoranlarda cuma-cumartesi akşamları sipariş yoğunluğunun tepeye ulaştığı saatlerde garson el terminallerinde veya kasa terminallerinde aniden beliren ‘Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool’ hatası restoranın tüm adisyon akışını kilitler. Kullanıcılar SQL Server ın çöktüğünü düşünerek bilgisayarı kapatıp açar; ancak birkaç dakika sonra aynı hata tekrarlanır. Bu problem veritabanının kapalı olması değil; SambaPOS istemcilerinin SQL Server a bağlanırken kullandığı Bağlantı Havuzunun (Connection Pool) tamamen tükenmesi ve açık bağlantıların kapatılmayarak arka planda sızdırılmasıdır (Connection Leak).
SQL Connection Pooling (Bağlantı Havuzlama) Mantığı ve Çökme Sebepleri
.NET ve SQL Server mimarisinde her veritabanı sorgusu için sıfırdan TCP soketi açıp kapatmak yüksek maliyetlidir:
- Bağlantı Havuzu: Sistem arka planda hazır bekleyen bir bağlantı havuzu (Varsayılan: Maksimum 100 Bağlantı) tutar. Terminal işlem yapacağı zaman havuzdan bir bağlantı alır, işi bitince havuza iade eder.
- Havuzun Boğulması: Çok sayıda el terminalinin olduğu veya entegrasyon yazılımlarının (Yemeksepeti, Getir, Trendyol sipariş botları) veritabanına sürekli bağlanıp oturumu
Close() / Dispose()etmeden açık unuttuğu durumlarda, 100 bağlantılık havuz saniyeler içinde tükenir. 101. bağlantı isteği havuzda boş yer bulamaz; 30 saniye bekler ve ekrana ‘Connection Pool Timeout’ hatası fırlatır.
1. Adım: SQL Server Üzerinde Açık Kalan Hayalet Bağlantıları (Sleeping Connections) Tespiti
Veritabanında hangi uygulamanın havuzu tıkadığını görmek için SSMS üzerinden şu sorgu işletilir:
USE [master];
GO
SELECT
DB_NAME(dbid) as VeritabaniAdi,
COUNT(dbid) as AcikBaglantiSayisi,
loginame as KullaniciAdi,
hostname as BaglananTerminal
FROM sys.sysprocesses
WHERE dbid = DB_ID('SAMBAPOS5')
GROUP BY dbid, loginame, hostname;
GOÇıktıda tek bir terminalin veya sipariş entegrasyon botunun üzerinde 70-80 açık bağlantı görülüyorsa, havuzu kilitleyen kaynak odur.
2. Adım: SambaPOS Bağlantı Dizesinde (Connection String) Havuz Boyutunu Artırma
Kriz anında havuz tavan sınırını yükselterek sistemin rahatlaması sağlanır:
- SambaPOS kurulu tüm terminallerde
C:ProgramDataSAMBAPOSSambaPOS5SambaSettings.txtdosyası Not Defteri ile açılır. - Veritabanı bağlantı dizesinin (ConnectionString) sonuna şu parametreler eklenir:
Max Pool Size=250;Connection Timeout=60;Pooling=true;Bu ayar, maksimum bağlantı sınırını 100 den 250 ye çıkarır ve kilitlenme anında zaman aşımı eşiğini 60 saniyeye yükselterek kuyruğu rahatlatır.
3. Adım: SQL Server Boşta Kalan Uyuyan Oturumları Otomatik Temizleme
Uyuyan ve işlem yapmayan açık bağlantıları periyodik öldürmek için SQL Server Agent veya zamanlanmış bir T-SQL betiği çalıştırılabilir:
DECLARE @spid INT
DECLARE cur CURSOR FOR
SELECT spid FROM sys.sysprocesses
WHERE status = 'sleeping' AND last_batch < DATEADD(MINUTE, -10, GETDATE()) AND spid > 50
OPEN cur
FETCH NEXT FROM cur INTO @spid
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('KILL ' + @spid)
FETCH NEXT FROM cur INTO @spid
END
CLOSE cur
DEALLOCATE curRestoran otomasyon sistemleri, SambaPOS çok kullanıcılı veritabanı optimizasyonu, yemek platformları entegrasyon bakımı ve SQL Server performans yönetiminde BaykalSoft Bilişim Hizmetleri ekibimizle 7/24 iletişime geçebilirsiniz.