Ana SayfaRestoran OtomasyonuMasaüstü OtomasyonSambaPOS Restoran Otomasyonunda 'SQL Server Express Bağlantı Sınırı ve Bağlantı Havuzu (Pool)...

SambaPOS Restoran Otomasyonunda ‘SQL Server Express Bağlantı Sınırı ve Bağlantı Havuzu (Pool) Dolması’ Hatası Çözüm Rehberi

Author

Date

Category

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:

  1. SambaPOS kurulu tüm terminallerde C:ProgramDataSAMBAPOSSambaPOS5SambaSettings.txt dosyası Not Defteri ile açılır.
  2. 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 cur

Restoran 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.

Önceki Gönderiler

Önceki Yorumlar