نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
العودة للتغريدات
مشكلةتم الحل

السيرفر بيقع بسبب كثرة الاتصالات: حل أيرور slots remaining rows error: sorry, too many clients already في PostgreSQL

K
kamel
·١٩ يوليو ٢٠٢٦·7 مشاهدة
أنا عامل تطبيق بـ Node.js وربطه بقاعدة بيانات PostgreSQL باستعمال مكتبة pg (node-postgres). كل ما يجي طلب (Request) للسيرفر، يروح يستعلم عن بيانات معينة من قاعدة البيانات ويرجعها لليوزر. الأبلكيشن في الأول بيشتغل طلقة وسريع جداً، بس أول ما يجي عليه ضغط شوية أو عدد مستخدمين يدخلوا في نفس الوقت، السيرفر بيضرب تماماً وقاعدة البيانات بترفض أي طلب جديد وتطلعلي الرسالة دي:
OTHER
error: sorry, too many clients already
    at Parser.parseErrorMessage (/app/node_modules/pg-protocol/dist/parser.js:287:98)
ولازم أعمل ريستارت للسيرفر عشان يرجع يشتغل تاني، وبعدين يقع تاني بنفس الطريقة! مش فاهم ليه الاتصالات بتخلص بسرعة كده مع إن الكود بسيط.
JavaScript
const { Client } = require('pg');
const express = require('express');
const app = express();

app.get('/api/users', async (req, res) => {
    // السطر المشتبه فيه: إنشاء اتصال جديد تماماً مع كل Request بيجي للسيرفر
    const client = new Client({
        connectionString: process.env.DATABASE_URL
    });

    try {
        await client.connect();
        const result = await client.query('SELECT * FROM users');
        res.json(result.rows);
        
        // السطر المفقود هنا: نسيان قفل الاتصال بعد انتهاء الطلب!
    } catch (error) {
        console.error(error);
        res.status(500).send("حصلت مشكلة في الخادم");
    }
});

app.listen(3000, () => console.log('Server is running'));
مشاكل-postgresqlأخطاء-قواعد-البياناتبرمجة-nodejsأداء-السيرفرحل-مشاكل-pgاتصال-قاعدة-البياناتأخطاء-backendكود-javascriptمشاكل-javascriptمشاكل-nodejs

التعليقات (1)

الحل المعتمد
nouvil
nouvilمنذ 91 يوم
المشكلة دي بتحصل لأنك بتفتح اتصال جديد كامل (new Client()) مع كل طلب بيجي للسيرفر، وكمان بعد ما الطلب بيخلص مفيش سطر بيقفل الاتصال ده (client.end()). بالتالي، الاتصالات بتفضل مفتوحة ومتعلقة في الذاكرة لحد ما قاعدة البيانات بتوصل للحد الأقصى المسموح بيه (المسموح بيه افتراضياً في Postgres بيكون 100 اتصال فقط)، فترفض أي حد جديد والسيرفر يقف. في التطبيقات الحية، مستحيل نفتح اتصال منفصل لكل طلب. الحل الصح هو استخدام نظام Pool (مجمّع الاتصالات). الـ Pool بيفتح عدد محدد وثابت من الاتصالات ويدورهم بين الطلبات ويعيد استخدامهم بذكاء، وأول ما الطلب يخلص بيرجع الاتصال للـ Pool تلقائياً:
JavaScript
const { Pool } = require('pg'); // 1. استدعاء Pool بدلاً من Client
const express = require('express');
const app = express();

// 2. إنشاء مجمّع اتصالات واحد فقط للتطبيق بالكامل
const pool = new Pool({
    connectionString: process.env.DATABASE_URL,
    max: 20, // أقصى عدد اتصالات مسموح بيها للـ Pool ده
    idleTimeoutMillis: 30000 // قفل الاتصال لو فضل خامل بدون استخدام
});

app.get('/api/users', async (req, res) => {
    try {
        // 3. تنفيذ الاستعلام مباشرة من الـ pool (هو هيتولى فتح وقفل وقفل الاتصال داخلياً)
        const result = await pool.query('SELECT * FROM users');
        res.json(result.rows);
    } catch (error) {
        console.error(error);
        res.status(500).send("حصلت مشكلة في الخادم");
    }
});

app.listen(3000, () => console.log('Server is running efficiently with Connection Pool'));

سجّل دخولك لإضافة تعليق

تسجيل الدخول
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر