• 0

ما الفرق بين pool و client في الاستعلام لقاعدة بيانات postgres

السلام عليكم

استعمل مكتبة pg في النود وفيها طريقتين للاستعلام عن البيانات كالتالي

const { Pool, Client } = require('pg')

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})



client.connect()
client.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  client.end()
})

 

ما الفرق بين الطريقتين ؟

ومتى استخدم الاولى ومتى الاخرى ؟

تمّ تعديل بواسطة مضحي Modhy
تعديل العنوان
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يقوم Pool بعمل أكثر من نسخة من client أي أكثر من instance of client والتي بدورها مسؤولة عن اتصال ثابت وحيد وتفيد في تخديم مستخدم واحد، أما Pool يعمل على خلق عدد محدد ولكن كبير نسبيا من client instance أو كينونات المستخدم وهذا يسمح بعمل عدة استعلامات متزامنة والتي بدورها تخدم أكثر من عمل client بنفس الوقت، وإن إغلاق Pool.end سيوقف جميع الاتصالات في المشروع لديك.

  • Clinet توفر اتصال ساكن static connection
  • Pool توفر اتصال ديناميكي dynamic list/pool of Client objects وتسمح لنا بإعادة استخدام الاتصال من النوع Client
    •  re-usable open client instances

الأفضل إنشاء كائن Pool واستخدامه، هذا يقلل من البطء وضعف الأداء الذي يتولد من إنشاء عدد كبير من الأغراض Client وهدمها و إعادة إنشائها لكل اتصال جديد مما يشكل عبئ على البرنامج وبطء

مثلا Pool تقوم بإنشاء 50 وحدة من Clinet والتي تخدم جميع الاتصالات من المستخدمين بنفس الوقت بدون هدم أي منهم، إنما بعد توقف أحد الاتصالات يستقبل أحد هذه ال Clinet الموجودة بالفعل الاتصال الجديد، لذلك لا تقم باستدعاء pool.end حتى آخر مرحلة من تشغيل المخدم أي في Terminate والإنهاء..

نفس هذه التقنية يمكن إيجادها في المسالك ضمن المعالجات Thread Pool لأن عملية قتل و إعادة إنشاء مسلك مكلفة للوقت

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

طيب الان عند انشاء اتصال للتأكد من بيانات المستخدم ( اسم المستخدم وكلمة المرور ) هنا استخدم pool او client

وهل يتم انهاءه بعد جلب البيانات ؟

شرحك للتصور العام للمفهومين واضح ولكن ربما بالمثال تتضح الصورة لي اكثر، لان الى الان توجد ضبابية عندي لاستخدام احدهما على الاخر

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

أعتقد أن كلاهما متماثل. لكن pool.query سيسمح لك بتنفيذ استعلام فردي أساسي عندما تحتاج إلى التنفيذ من عميل يمكن الوصول إليه من مجموعة مؤشرات ترابط العميل.

لذلك يمكن استخدام pool.query لتشغيل الاستعلام مباشرة بدلاً من الحصول على عميل ثم تشغيل الاستعلام مع هذا العميل.

يمكنك استخدام pool بهذه الطريقة 

const { Pool } = require('pg')

const pool = new Pool()

pool.connect((err, client, release) => {
  if (err) {
    return console.error('Error acquiring client', err.stack)
  }
  client.query('SELECT NOW()', (err, result) => { 
    release()
    if (err) {
      return console.error('Error executing query', err.stack)
    }
    console.log(result.rows)
  })
})

نفس العملية في الأعلى بدون استخدام pool

const { Client } = require('pg').Client
const client = new Client()
client.connect()
client.query('SELECT NOW()', (err, res) => {
  if (err) throw err
  console.log(res)
  client.end()
})

مباشرة استدعاء query من pool

const { Pool } = require('pg')

const pool = new Pool()

// Direct query without acquiring client object.
pool.query('SELECT $1::text as name', ['brianc'], (err, result) => {
  if (err) {
    return console.error('Error executing query', err.stack)
  }
  console.log(result.rows[0].name) // brianc
})

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

كلام جميل صلاح وشرحك وضح الصورة اكثر بالنسبة لطريقة الاستخدام

السؤال ما الحكمة من تواجد الخيارين ؟ لماذا لا يوجد فقط ال pool ؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ الآن قال مضحي Modhy:

لماذا لا يوجد فقط ال pool ؟

لأنه يستخدم موارد الجهاز بشكل أكبر حيث يحجز ذاكرة أكثر وليس ضروريا إن كان عدد المستخدمين المتوقع قليل.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

كم يعني قليل ؟

ومتى اعمل end لهذا ال pool ؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 9 دقائق مضت قال مضحي Modhy:

كم يعني قليل ؟

Client تستعمل عندما يكون عدد الزوار بالعشرات، أما Pool بالآلاف

بتاريخ 9 دقائق مضت قال مضحي Modhy:

ومتى اعمل end لهذا ال pool ؟

لايتوجب إيقافها طالما أن المخدم يعمل، فهي لا تستجيب لطلبية واحدة فقط، إنما لجميع طلبيات المستخدمين طيلة فترة تشغيل المخدم

لا تقم بإيقافها

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 3 ساعات قال Salah Eddin Berriani:

pool.connect((err, client, release) => {

ما فائدة release هنا ؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ On 8/13/2021 at 10:29 قال مضحي Modhy:

ما فائدة release هنا ؟

هي وظيفة يمكنك مناداتها بعد انتهاء العملية للتنظيف 

 const client = await pool.connect()
  try {
    const res = await client.query('SELECT * FROM users WHERE id = $1', [1])
    console.log(res.rows[0])
  } catch (error) {
    console.log(err.stack)
  } finally {
    // تحرير العملية
    client.release()
  }

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن