اذهب إلى المحتوى
  • 0

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

مضحي Modhy

السؤال

السلام عليكم

استعمل مكتبة 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
تعديل العنوان
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 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
بتاريخ الآن قال مضحي Modhy:

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

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

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

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

كم يعني قليل ؟

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

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

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

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

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

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

  • 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()
  }

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...