استكشاف أخطاء الاتصال العابرة وإصلاحها في SQL Database وSQL Managed Instance

ينطبق على: Azure SQL Database وAzure SQL Managed Instance وAzure Synapse Analytics

توضح هذه المقالة كيفية منع أخطاء الاتصال والأخطاء العابرة التي يواجهها تطبيق العميل عند تفاعله مع قاعدة بيانات Azure SQL، ومثيل Azure SQL المُدار، وAzure Synapse Analytics، واستكشاف الأخطاء وإصلاحها وتشخيصها والتخفيف من حدتها. تعرف على كيفية تكوين منطق إعادة المحاولة وإنشاء سلسلة الاتصال وضبط إعدادات الاتصال الأخرى.

أخطاء عابرة (أخطاء عابرة)

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

إذا كان برنامج العميل الخاص بك يستخدم ADO.NET؛ فسيتم إعلام برنامجك بالخطأ العابر من خلال طرح SqlException.

اتصال مقابل الأمر

أعد محاولة الاتصال بقاعدة بيانات SQL وSQL Managed Instance أو قم بتأسيسهما مرة أخرى؛ بناءً على ما يلي:

  • يحدث خطأ عابر أثناء محاولة الاتصال

بعد تأخير لعدة ثوانٍ؛ أعد محاولة الاتصال.

  • يحدث خطأ عابر أثناء أمر استعلام قاعدة بيانات SQL و SQL Managed Instance

لا تحاول إعادة الأمر فورًا. بدلاً من ذلك، وبعد تأخير، قم بإنشاء الاتصال حديثًا. ثم أعد محاولة الأمر.

أعد محاولة المنطق للأخطاء العابرة

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

مبادئ لإعادة المحاولة

  • إذا كان الخطأ عابرًا، فأعد محاولة فتح اتصال.
  • لا تقم بإعادة محاولة استخدام عبارة SQL Managed Instance من قاعدة بيانات SQL أو SQL Managed Instance SELECT والتي فشلت بسبب حدوث خطأ عابر. بدلاً من ذلك، قم بتأسيس اتصال جديد، ثم أعد محاولة SELECT.
  • عندما تفشل عبارة SQL Database أو SQL Managed Instance UPDATE مع حدوث خطأ عابر؛ قم بتأسيس اتصال جديد قبل إعادة محاولة التحديث. يجب أن يضمن منطق إعادة المحاولة إما انتهاء معاملة قاعدة البيانات بالكامل أو التراجع عن المعاملة بالكامل.

اعتبارات أخرى لإعادة المحاولة

  • يمكن لبرنامج الدُفعات الذي يبدأ تلقائيًا بعد ساعات العمل وينتهي قبل الصباح أن يتحلى بالصبر الشديد مع فترات زمنية طويلة بين محاولات إعادة المحاولة.
  • يجب أن يأخذ برنامج واجهة المستخدم في الحسبان ميل الإنسان إلى الاستسلام بعد طول انتظار. يجب ألا يعيد الحل المحاولة كل بضع ثوانٍ؛ لأن هذه النُهج يمكن أن تغمر النظام بالطلبات.

زيادة الفاصل الزمني بين عمليات إعادة المحاولة

نوصيك بالانتظار لمدة 5 ثوانٍ قبل إعادة المحاولة الأولى. قد تؤدي إعادة المحاولة بعد تأخير أقل من 5 ثوانٍ إلى إرباك الخدمة السحابية. لكل إعادة محاولة لاحقة: يجب أن يزيد التأخير بشكل كبير، وبحد أقصى 60 ثانية.

لمناقشة فترة المنع للعملاء الذين يستخدمون ADO.NET، راجع تجميع الاتصالات (ADO.NET).

قد ترغب أيضًا في تعيين الحد الأقصى لعدد المحاولات قبل إنهاء البرنامج ذاتيًا.

عينات التعليمات البرمجية مع منطق إعادة المحاولة

تتوفر أمثلة التعليمات البرمجية مع منطق إعادة المحاولة على:

اختبر منطق إعادة المحاولة

لاختبار منطق إعادة المحاولة الخاص بك؛ يجب عليك محاكاة أو التسبب في حدوث خطأ يمكن تصحيحه أثناء استمرار تشغيل البرنامج.

اختبر عن طريق قطع الاتصال بالشبكة

تتمثل إحدى الطرق التي يمكنك من خلالها اختبار منطق إعادة المحاولة في فصل الكمبيوتر العميل عن الشبكة أثناء تشغيل البرنامج. الخطأ هو:

  • SqlException.Number = 11001
  • الرسالة: "لا يوجد مضيف معروف"

كجزء من محاولة إعادة المحاولة الأولى؛ يمكنك إعادة توصيل الكمبيوتر العميل بالشبكة ثم محاولة الاتصال.

لجعل هذا الاختبار عمليًا؛ افصل الكمبيوتر عن الشبكة قبل بدء تشغيل البرنامج. ثم يتعرف برنامجك على معلمة وقت التشغيل التي تجعل البرنامج يقوم بما يلي:

  • قم بإضافة 11001 مؤقتًا إلى قائمة الأخطاء الخاصة به لاعتبارها عابرة.
  • حاول الاتصال الأول كالمعتاد.
  • بعد اكتشاف الخطأ قم بإزالة 11001 من القائمة.
  • اعرض رسالة تخبر المستخدم بتوصيل الكمبيوتر بالشبكة.
  • أوقف المزيد من التنفيذ مؤقتًا باستخدام طريقة Console.ReadLine أو باستخدام مربع حوار مع الزر "موافق". يضغط المستخدم على مفتاح Enter بعد توصيل الكمبيوتر بالشبكة.
  • حاول الاتصال مرة أخرى؛ وتوقع النجاح.

اختبر عن طريق كتابة اسم المستخدم بشكل خاطئ عند الاتصال

يمكن لبرنامجك أن يخطئ عن قصد في كتابة اسم المستخدم قبل محاولة الاتصال الأولى. الخطأ هو:

  • SqlException.Number = 18456
  • الرسالة: "فشل تسجيل الدخول للمستخدم" "WRONG_MyUserName".

كجزء من محاولة إعادة المحاولة الأولى؛ يمكن للبرنامج تصحيح الخطأ الإملائي ثم محاولة الاتصال.

لجعل هذا الاختبار عمليًا؛ يتعرف برنامجك على معلمة وقت التشغيل التي تجعل البرنامج يقوم بما يلي:

  • قم بإضافة 18456 مؤقتًا إلى قائمة الأخطاء الخاصة به لاعتبارها عابرة.
  • أضف "WRONG_" إلى اسم المستخدم عن قصد.
  • بعد اكتشاف الخطأ قم بإزالة 18456 من القائمة.
  • قم بإزالة "WRONG_" من اسم المستخدم.
  • حاول الاتصال مرة أخرى؛ وتوقع النجاح.

معلمات SqlConnection .NET لإعادة محاولة الاتصال

إذا كان برنامج العميل الخاص بك يتصل بقاعدة البيانات في قاعدة بيانات SQL باستخدام فئة .NET Framework System.Data.SqlClient.SqlConnection؛ فاستخدم .NET 4.6.1 أو إصدار أحدث (أو .NET Core) بحيث يمكنك استخدم ميزة إعادة محاولة الاتصال الخاصة به. لمزيد من المعلومات حول الميزة؛ راجع خاصية SqlConnection.ConnectionString.

عند إنشاء سلسلة الاتصال لكائن SqlConnection؛ قم بتنسيق القيم بين المعلمات التالية:

  • ConnectRetryCount: الافتراضي 1. النطاق من 0 إلى 255.
  • ConnectRetryInterval: الافتراضي 10 ثوانٍ. النطاق من 1 إلى 60.
  • Connection Timeout: الافتراضي 15 ثانية. النطاق من 0 إلى 2147483647.

على وجه التحديد، يجب أن تجعل القيم التي اخترتها المساواة التالية صحيحة: Connection Timeout = ConnectRetryCount * ConnectionRetryInterval

على سبيل المثال، إذا كان العدد يساوي 3 والفاصل الزمني يساوي 10 ثوانٍ، فإن المهلة البالغة 29 ثانية فقط لا تمنح النظام وقتا كافيا لإعادة المحاولة الثالثة والأخيرة للاتصال: 29 < 3 * 10.

اتصال مقابل الأمر

تسمح معلمات ConnectRetryCount و ConnectRetryInterval لكائن SqlConnection بإعادة محاولة عملية الاتصال دون إخبار برنامجك أو إزعاجه، مثل إعادة التحكم إلى برنامجك. يمكن أن تحدث عمليات إعادة المحاولة في المواقف التالية:

  • SqlConnection.Open استدعاء الأسلوب
  • استدعاء الأسلوب SqlConnection.Execute

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

يجب دمج ConnectRetryCount مع منطق إعادة محاولة التطبيق

لنفترض أن التطبيق الخاص بك يحتوي على منطق قوي لإعادة المحاولة المخصصة. قد يعيد عملية الاتصال أربع مرات. إذا قمت بإضافة ConnectRetryInterval و ConnectRetryCount = 3 إلى سلسلة الاتصال، فستزيد عدد مرات إعادة المحاولة إلى 4 * 3 = 12 إعادة المحاولة. قد لا تنوي مثل هذا العدد الكبير من عمليات إعادة المحاولة.

اتصالات بقاعدة البيانات الخاصة بك في قاعدة بيانات SQL

الاتصال: سلسلة الاتصال

تختلف سلسلة الاتصال الضرورية للاتصال بقاعدة البيانات قليلاً عن السلسلة المستخدمة للاتصال بـ SQL Server. يمكنك نسخ سلسلة الاتصال لقاعدة البيانات الخاصة بك من مدخل Microsoft Azure.

احصل على سلسلة الاتصال من مدخل Azure

استخدم مدخل Azure للحصول على سلسلة الاتصال الضرورية لبرنامج العميل للتفاعل مع Azure SQL Database.

  1. حدد جميع الخدمات>قواعد بيانات SQL.

  2. أدخل اسم قاعدة البيانات في مربع نص عامل التصفية بالقرب من أعلى يسار شفرة قواعد بيانات SQL.

  3. حدد الصف لقاعدة البيانات الخاصة بك.

  4. بعد ظهور الشفر لقاعدة البيانات الخاصة بك ومن أجل الراحة البصرية، حدد أزرار التصغير لطي الشفرات التي استخدمتها في التصفح وتصفية قاعدة البيانات.

  5. على الشفرة الخاصة بقاعدة البيانات، حدد إظهار سلاسل اتصال قاعدة البيانات.

  6. انسخ سلسلة الاتصال المناسبة. أي إذا كنت تنوي استخدام مكتبة الاتصال ADO.NET، فانسخ السلسلة المناسبة من علامة التبويب ADO.NET.

    Copy the ADO connection string for your database

  7. حرر سلسلة الاتصال حسب الحاجة. أي يوصى بإدخال كلمة المرور الخاصة بك في سلسلة الاتصال، أو إزالة "@<servername>" من اسم المستخدم إذا كان اسم المستخدم أو اسم الخادم طويل جدا.

  8. يوصى، في تنسيق أو آخر، بلصق معلومات سلسلة الاتصال في رمز برنامج العميل لديك.

لمزيد من المعلومات، راجع سلاسل الاتصال وملفات التكوين.

الاتصال: عنوان IP

يجب تكوين قاعدة بيانات SQL لقبول الاتصال من عنوان IP للكمبيوتر الذي يستضيف برنامج العميل الخاص بك. لإعداد هذا التكوين؛ قم بتحرير إعدادات جدار الحماية من خلال مدخل Microsoft Azure.

إذا نسيت تكوين عنوان IP فسوف يفشل برنامجك مع ظهور رسالة خطأ مفيدة توضح عنوان IP الضروري.

  1. تسجيل الدخول إلى ⁧⁩مدخل Azure⁧⁩.

  2. في القائمة على اليسار، حدد جميع الخدمات.

  3. قم بالتمرير وحدد خوادم SQL.

    Find your Azure SQL Database server in the portal

  4. في مربع نص عامل التصفية، ابدأ بكتابة اسم الخادم. يتم عرض الصف الخاص بك.

  5. حدد الصف للخادم الخاص بك. يتم عرض شفرة للخادم لديك.

  6. على شفرة الخادم، حدد «الإعدادات».

  7. حدد «جدار الحماية».

    Select Settings > Firewall

  8. حدد ⁧⁩إضافة عنوان IP للعميل⁧⁩. اكتب اسما للقاعدة الجديدة في مربع النص الأول.

  9. اكتب قيم عناوين IP المنخفضة والعالية للنطاق الذي تريد تمكينه.

    • يمكن أن يكون من السهل الحصول على نهاية منخفضة القيمة ب.0ونهاية عالية القيمة ب.255.
  10. حدد "⁧⁩Save⁧⁩".

لمزيد من المعلومات؛ راجع تكوين إعدادات جدار الحماية في قاعدة بيانات SQL.

الاتصال: الموانئ

عادةً ما تحتاج إلى التأكد من فتح المنفذ 1433 فقط للاتصال الخارجي على الكمبيوتر الذي يستضيف برنامج العميل الخاص بك.

على سبيل المثال: عند استضافة برنامج العميل الخاص بك على جهاز كمبيوتر يعمل بنظام Windows؛ يمكنك استخدام جدار حماية Windows على المضيف لفتح المنفذ 1433.

  1. افتح لوحة التحكم.
  2. حدد كافة عناصر لوحة التحكم>جدار حماية Windows>الإعدادات المتقدمة>القواعد الصادرة>الإجراءات>قاعدة جديدة.

إذا تمت استضافة برنامج العميل الخاص بك على جهاز ظاهري Azure (VM) فاقرأ المنافذ التي تتجاوز 1433 لـ ADO.NET 4.5 وقاعدة بيانات SQL.

للحصول على معلومات أساسية حول تكوين المنافذ وعناوين IP في قاعدة البيانات؛ راجع جدار حماية قاعدة بيانات Azure SQL.

الاتصال: ADO.NET 4.6.2 أو أحدث

إذا كان برنامجك يستخدم فئات ADO.NET مثل System.Data.SqlClient.SqlConnection للاتصال بقاعدة بيانات SQL؛ فإننا نوصي باستخدام .NET Framework الإصدار 4.6.2 أو إصدار أحدث.

بدءًا من ADO.NET 4.6.2

  • محاولة الاتصال المفتوحة لإعادة المحاولة فورًا لـ Azure SQL، وبالتالي تحسين أداء التطبيقات التي تدعم السحابة.

بدءًا من ADO.NET 4.6.1

  • بالنسبة لقاعدة بيانات SQL؛ يتم تحسين الوثوقية عند فتح اتصال باستخدام الأسلوب SqlConnection.Open . تتضمن طريقة الفتح الآن أفضل آليات إعادة المحاولة استجابةً لأخطاء عابرة لأخطاء معينة خلال فترة مهلة الاتصال.
  • يتم دعم تجميع الاتصال، والذي يتضمن تحققًا فعالاً من أن كائن الاتصال الذي يوفره لبرنامجك يعمل.

عند استخدام كائن اتصال من تجمع اتصال؛ نوصي بأن يقوم البرنامج الخاص بك بإغلاق الاتصال مؤقتًا عندما لا يكون قيد الاستخدام على الفور. إعادة فتح اتصال ليس مكلفًا، ولكن إنشاء اتصال جديد.

إذا كنت تستخدم ADO.NET 4.0 أو إصدارًا أقدم؛ نوصي بالترقية إلى أحدث إصدار من ADO.NET. اعتبارًا من أغسطس 2018؛ يمكنك تنزيل ADO.NET 4.6.2.

التشخيص

التشخيصات: اختبر ما إذا كان بإمكان الأدوات المساعدة الاتصال

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

على أي جهاز كمبيوتر يعمل بنظام Windows يمكنك تجربة هذه الأدوات المساعدة:

  • SQL Server Management Studio (ssms.exe) الذي يتصل باستخدام ADO.NET
  • sqlcmd.exe الذي يتم الاتصال باستخدام ODBC

بعد توصيل البرنامج اختبر ما إذا كان استعلام SQL SELECT القصير يعمل أم لا.

التشخيص: تحقق من المنافذ المفتوحة

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

في نظام Linux؛ قد تكون الأدوات المساعدة التالية مفيدة:

  • netstat -nap
  • nmap -sS -O 127.0.0.1: غيّر قيمة المثال لتكون عنوان IP الخاص بك.

في نظام التشغيل Windows: قد تكون الأداة المساعدة PortQry.exe مفيدة. في ما يلي مثال على تنفيذ استفسر عن حالة المنفذ في قاعدة بيانات في قاعدة بيانات SQL والتي تم تشغيلها على جهاز كمبيوتر محمول:

[C:\Users\johndoe\]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called: johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:\Users\johndoe\]
>>

التشخيص: سجل أخطائك

في بعض الأحيان؛ يتم تشخيص المشكلة المتقطعة بشكل أفضل عن طريق اكتشاف نمط عام على مدار أيام أو أسابيع.

يمكن لعميلك المساعدة في التشخيص عن طريق تسجيل جميع الأخطاء التي يواجهها. قد تتمكن من ربط إدخالات السجل ببيانات الخطأ التي تسجلها قاعدة بيانات SQL نفسها داخليًا.

توفر Enterprise Library 6 (EntLib60) فئات مُدارة بواسطة NET. للمساعدة في التسجيل. لمزيد من المعلومات، راجع 5 - بنفس سهولة السقوط من السجل: استخدم كتلة تطبيق التسجيل.

التشخيص: افحص سجلات النظام بحثًا عن الأخطاء

فيما يلي بعض عبارات Transact-SQL SELECT التي تستعلم عن سجلات الأخطاء والمعلومات الأخرى.

الاستعلام عن السجل الوصف
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
تقدم طريقة العرض sys.event_log معلومات حول الأحداث الفردية، والتي تتضمن بعض الأحداث التي يمكن أن تسبب أخطاء عابرة أو فشل الاتصال.

من الناحية المثالية: يمكنك ربط قيم start_time أو end_time بالمعلومات المتعلقة بالوقت الذي واجه فيه برنامج العميل مشاكل.

يجب الاتصال بقاعدة البيانات الرئيسية لتشغيل هذا الاستعلام.
SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
تقدم طريقة العرض sys.database_connection_stats أعدادًا مجمعة من أنواع الأحداث لعمليات التشخيص الإضافية.

يجب الاتصال بقاعدة البيانات الرئيسية لتشغيل هذا الاستعلام.

التشخيص: ابحث عن أحداث المشكلة في سجل قاعدة بيانات SQL

يمكنك البحث عن إدخالات حول أحداث المشكلة في سجل قاعدة بيانات SQL. جرب عبارة Transact-SQL SELECT التالية في قاعدة البيانات الرئيسية :

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

تم إرجاع عدد قليل من الصفوف من sys.fn_xe_telemetry_blob_target_read_file

يوضح المثال التالي الشكل الذي قد يبدو عليه الصف الذي تم إرجاعه. غالبًا ما تكون القيم الخالية المعروضة خالية في الصفوف الأخرى.

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

مكتبة المؤسسة 6

Enterprise Library 6 (EntLib60) عبارة عن إطار عمل لفئات NET. التي تساعدك على تنفيذ عملاء قويين للخدمات السحابية؛ أحدها قاعدة بيانات SQL. لتحديد الموضوعات المخصصة لكل منطقة يمكن أن يساعد EntLib60 فيها؛ راجع مكتبة المؤسسة 6 - أبريل 2013.

منطق إعادة المحاولة لمعالجة الأخطاء العابرة هو أحد المجالات التي يمكن أن يساعد فيها EntLib60. لمزيد من المعلومات؛ راجع 4 - المثابرة، سر جميع الانتصارات: استخدام كتلة تطبيق معالجة الأخطاء العابرة.

ملاحظة

شفرة المصدر لـ EntLib60 متاحة للتنزيل العام من مركز التنزيل. ليس لدى Microsoft أي خطط لإجراء المزيد من تحديثات الميزات أو تحديثات الصيانة لـ EntLib.

فئات EntLib60 للأخطاء العابرة وأعد المحاولة

تعتبر الفئات EntLib60 التالية مفيدة بشكل خاص لمنطق إعادة المحاولة. تم العثور على كل هذه الفئات في مساحة الاسم أو تحتها Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.

In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • فئة RetryPolicy
    • طريقة ExecuteAction
  • فئة ExponentialBackoff
  • SqlDatabaseTransientErrorDetectionStrategy class
  • فئة ResolutionSqlConnection
    • طريقة ExecuteCommand

In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • فئة AlwaysTransientErrorDetectionStrategy
  • فئة NeverTransientErrorDetectionStrategy

فيما يلي بعض الروابط لمعلومات حول EntLib60:

EntLib60: كتلة التسجيل

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

لمزيد من المعلومات، راجع 5 - بنفس سهولة السقوط من السجل: استخدم كتلة تطبيق التسجيل.

EntLib60 هو كود مصدر طريقة عابرة

التالي: من فئة SqlDatabaseTransientErrorDetectionStrategy ، هو كود المصدر C # للأسلوب IsTransient . توضح التعليمة البرمجية المصدرية الأخطاء التي تم اعتبارها عابرة وتستحق إعادة المحاولة اعتبارًا من أبريل 2013.

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

الخطوات التالية

راجع أيضًا