لماذا يعد إجراء اتصالات قاعدة بيانات متعددة في طلب واحد ممارسة سيئة؟

StackOverflow https://stackoverflow.com/questions/28590

سؤال

مناقشة حول Singletons في بي أتش بي لقد جعلني أفكر في هذه القضية أكثر فأكثر.يرشدك معظم الأشخاص إلى أنه لا ينبغي عليك إجراء مجموعة من اتصالات قاعدة البيانات في طلب واحد، ولدي فضول لمعرفة سبب تفكيرك.فكرتي الأولى هي تكلفة البرنامج النصي الخاص بك لتقديم العديد من الطلبات إلى قاعدة البيانات، ولكن بعد ذلك أواجه نفسي بالسؤال:ألن تجعل الاتصالات المتعددة الاستعلام المتزامن أكثر كفاءة؟

ماذا عن بعض الإجابات (مع الأدلة أيها الناس) من بعض الأشخاص الذين يعرفون؟

هل كانت مفيدة؟

المحلول

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

بالإضافة إلى ذلك، فإن إجراء الكثير من الاتصالات الإضافية في قاعدة البيانات لا يساعد في أي شيء ما لم تكن هناك موارد على خادم قاعدة البيانات خاملاً.إذا كان لديك 8 مراكز ويتم استخدام مركز واحد فقط لتلبية أحد الاستعلامات، فمن المؤكد أن إجراء اتصال آخر قد يساعد.على الأرجح، على الرغم من أنك تستخدم بالفعل جميع النوى المتاحة.من المحتمل أيضًا أن تصل إلى نفس محرك الأقراص الثابتة لكل طلب قاعدة بيانات، وتضيف تنافس قفل إضافي.

إذا كانت قاعدة بياناتك تحتوي على أي شيء يشبه الاستخدام العالي، فلن تساعد إضافة اتصالات إضافية.سيكون ذلك بمثابة إنتاج سلاسل رسائل إضافية في تطبيق ما مع الأمل الأعمى في أن يؤدي التزامن الإضافي إلى تسريع المعالجة.هو - هي قد في بعض الظروف المعينة، ولكن في حالات أخرى، سيؤدي ذلك إلى إبطائك أثناء قيامك بضغط القرص الصلب، وإضاعة الوقت في تبديل المهام، وإدخال حملات المزامنة.

نصائح أخرى

إنها تكلفة إعداد الاتصال ونقل البيانات ثم تمزيقها.سوف تلتهم أدائك.

من الصعب الحصول على الأدلة ولكن ضع في اعتبارك ما يلي ...

لنفترض أن الأمر يستغرق x ميكروثانية لإجراء اتصال.

أنت الآن تريد تقديم عدة طلبات والحصول على البيانات ذهابًا وإيابًا.لنفترض أن الفرق في وقت النقل لا يكاد يذكر بين اتصال واحد والعديد (من أجل الجدال فقط).

لنفترض الآن أن الأمر يستغرق ميكروثانية لإغلاق الاتصال.

سيستغرق فتح اتصال واحد x+y ميكروثانية من الحمل.فتح العديد سيستغرق n * (x+y).وهذا سوف يؤخر تنفيذ الخاص بك.

عادةً ما يكون إعداد اتصال قاعدة البيانات أمرًا ثقيلًا للغاية.أشياء كثيرة تجري خلف الكواليس (دقة DNS/اتصال TCP/المصافحة/المصادقة/الاستعلام الفعلي).

لقد واجهت مشكلة ذات مرة مع بعض تكوينات DNS الغريبة التي جعلت كل اتصال TCP يستغرق بضع ثوانٍ قبل الصعود.استغرق إجراء تسجيل الدخول الخاص بي (بسبب البنية المعقدة) 3 اتصالات قاعدة بيانات مختلفة لإكمالها.مع هذه المشكلة، كان تسجيل الدخول يستغرق وقتًا طويلاً.قمنا بعد ذلك بإعادة هيكلة الكود لجعله يمر عبر اتصال واحد فقط.

نحن نصل إلى Informix من .NET ونستخدم اتصالات متعددة.ما لم نبدأ معاملة على كل اتصال، فغالبًا ما تتم معالجتها في تجمع الاتصالات.أعلم أن هذا خاص جدًا بالعلامة التجارية، ولكن الوصول السهل لأنظمة قواعد البيانات (؟) سيجمع الاتصالات بأفضل ما في وسعها.

جانبًا، واجهنا مشكلة في عدد الاتصالات بسبب الاتصالات بين قواعد البيانات.يدعم Informix المرادفات، لذلك قمنا بتمييز المجرمين الشائعين وتم التعامل مع الاتصالات المتعددة من جانب الخادم، مما يوفر الكثير في وقت النقل، والنفقات العامة لإنشاء الاتصال، ورسوم الترخيص (الجوهر الحقيقي لموقفنا).

أفترض أن السبب في ذلك هو أن طلباتك لا يتم إرسالها بشكل غير متزامن، نظرًا لأن طلباتك تتم بشكل متكرر على الخادم، ويتم حظرها في كل مرة، يتعين عليك دفع تكاليف إنشاء اتصال في كل مرة، بينما يتعين عليك فقط القيام بذلك مرة واحدة...

في Flex، يتم استدعاء جميع مكالمات خدمة الويب تلقائيًا بشكل غير متزامن، لذلك من الشائع رؤية اتصالات متعددة، أو طلبات في قائمة الانتظار على نفس الاتصال.

تعمل الطلبات غير المتزامنة على تقليل تكلفة الاتصال من خلال وقت الطلب/الاستجابة الأسرع... لأنك لا تستطيع ذلك بسهولة تحقيق ذلك في PHP دون بعض الخيوط، ثم يكون أداء الأداء أكبر من مجرد إعادة استخدام نفس الاتصال.

هذا هو سنتي 2...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top