الوصول إلى البيانات
PostgreSQL من Node، دون حقن SQL ودون اتصال مفقود.
الوصول إلى البيانات
تعمل خدمة ما بشكل ممتاز طوال أسابيع، ثم تتجمّد بعد ظهر يوم ثلاثاء. لا خطأ ولا ذروة في الحمل: كل ما في الأمر أن جميع الطلبات تنتظر إلى ما لا نهاية. التشخيص هو نفسه تقريبًا دائمًا: مسار في الشيفرة يستعير اتصالًا من المجمّع ولا يعيده أبدًا، لأن استثناءً وقع بين الاستعارة والتحرير. وبعد بضع مئات من الحالات يفرغ المجمّع، ويظل كل طلب جديد ينتظر اتصالًا لن يعود أبدًا.
أما العطل الكبير الآخر في هذه الطبقة فهو حقن SQL، وهو يحدث دائمًا تقريبًا للسبب نفسه: بنى أحدهم الاستعلام بتجميع السلاسل النصية لأن الاستعلام المُعلَّم بالمعاملات لم يكن يناسب حالته، كاسم عمود ديناميكي، أو عبارة IN متغيرة الحجم، أو ترتيب قابل للضبط. لهذه الحالات الثلاث حلول نظيفة، وهذا الدرس يقدّمها. الخيط الناظم: الاتصال يُستعار ويُعاد دائمًا، والقيمة القادمة من العميل لا تدخل أبدًا في نص الاستعلام.
مجمّع الاتصالات
فتح اتصال PostgreSQL يكلّف عدة أجزاء من الثانية: مصافحة TCP، والمصادقة، وإنشاء عملية خادم على جهة قاعدة البيانات. يحتفظ المجمّع بمجموعة من الاتصالات المفتوحة ويُعيرها.
// src/bd/pool.js
import pg from 'pg';
import { config } from '../config.js';
export const pool = new pg.Pool({
connectionString: config.urlBase,
max: 10, // connexions par instance de processus
idleTimeoutMillis: 30_000, // ferme les connexions inactives
connectionTimeoutMillis: 5_000, // échoue vite si le groupe est saturé
ssl: config.env === 'production' ? { rejectUnauthorized: true } : false,
});
pool.on('error', (err) => {
// Erreur sur une connexion INACTIVE : sans cet écouteur, le processus meurt.
console.error('Erreur du groupe de connexions', err);
});
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش