سؤال

لدي إعداد قاعدتي بيانات Microsoft SQL 2005 في سيناريو الفشل.تحتوي سلاسل اتصال التطبيق على "شريك تجاوز الفشل" المحدد في سلسلة الاتصال.

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

هل يرجع ذلك أساسًا إلى السرعة التي تفشل بها قواعد البيانات أم أن هناك شيئًا آخر يمكن القيام به لمنع هذه الأخطاء؟

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

المحلول

أنت على حق:يتعلق الأمر بالمدة التي تستغرقها قواعد البيانات حتى تفشل.

يسير المخطط الزمني لتجاوز فشل النسخ المتزامن على النحو التالي:

  1. يقوم الخادم الأساسي A بإيقاف التشغيل وإغلاق كافة الاتصالات.من هذه النقطة فصاعدًا، أي عميل يحاول الاتصال بالخادم A سيتم إغلاق اتصاله بالقوة.
  2. يتأكد الخادم الأساسي A من مزامنة سجلاته بالكامل مع الخادم الثانوي B.
  3. تبدأ خدمة SQL الخاصة بالخادم B.
  4. تبدأ خدمة SQL الخاصة بالخادم B في قبول الاتصالات، وعند هذه النقطة يمكن للعملاء الاتصال مرة أخرى.

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

نصائح أخرى

والتحذير: على "شريك الفشل" كان الخيار غير متوفرة قبل سنوات قليلة (! أو على الأقل لم أكن على علم به) لذلك قد تكون قديمة الحل التالي

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

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

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