تكرار السؤال: …
الإجابة المختصرة
تدير حمامات الاتصال مجموعة اتصالات مفتوحة مسبقاً وتشاركها بين الطلبات؛ وتشبعها يؤدي لتراكم الطلبات في طابور الانتظار وزيادة زمن الاستجابة والـ timeouts.
الشرح
إنشاء اتصال جديد بقاعدة البيانات (TCP Handshake + TLS + Authentication) مكلف للغاية ويستغرق عشرات المللي ثوانٍ. يوفر الـ Pool (مثل pg.Pool) عدداً ثابتاً من الاتصالات (مثلاً 20 اتصالاً) يتم استعارتها عبر client = await pool.connect() وإرجاعها بـ client.release(). إذا استغرقت الاستعلامات وقتاً طويلاً أو حدث تسريب اتصالات (نسيان release)، سيعلق السيرفر في انتظار اتصال متاح.
مثال بالكود
const client = await pool.connect();
try {
const res = await client.query("SELECT * FROM users WHERE id = $1", [id]);
} finally {
client.release(); // ضروري دائماً في finally
}أخطاء شائعة
- نسيان استدعاء client.release() داخل كتلة finally مما يفرغ الـ pool بسرعة ويسقط السيرفر.