سؤال

في موقعنا الخادم / العميل في الإعداد فنحن نشهد بعض سلوك غريب. العميل هو C / C ++ - الطلب الذي يستخدم OCI للاتصال خادم أوراكل (باستخدام OTL المكتبة) .

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

وماذا الاحتمالات (إن وجدت) يتم توفيرها من قبل شركة أوراكل للكشف عن هذه الاتصالات توقفت من جانب العميل التطبيق واستعادة بطريقة أكثر أو أقل أمنا؟

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

المحلول

وهذا هو خلل في أوراكل (أو يطلق عليه الميزة) حتى 11.1.0.6 وقالوا التصحيح على أوراكل 11g الافراج 1 (التصحيح 11.1.0.7) الذي يحتوي على الإصلاح. بحاجة الى ان نرى ذلك. اذا حدث ذلك سيكون لديك لإلغاء (قتل) في موضوع تنفيذ هذا الإجراء. لا نهج جيد على الرغم

نصائح أخرى

في كل ما عندي من مخطط DB لدي جدول مع سجل واحد مستمر. مجرد استطلاع هذا الجدول بشكل دوري حسب الطلب SQL بسيط. كل أساليب أخرى غير موثوق بها.

وهناك API set_timeout في OTL التي قد تكون مفيدة لذلك.

وتحرير: في الواقع، وتجاهل ذلك. set_timeout لا يعمل مع اوراسكوم للانشاء. إلقاء نظرة على وصف set_timeout من هنا حيث يصف التقنية التي يمكن استخدامها مع أوراسكوم للإنشاء

ويبدو أنك بحاجة لاطلاق النار قبالة الاستعلام إلى قاعدة البيانات (على سبيل المثال SELECT * FROM dual;)، ثم إذا لم تستجب قاعدة البيانات في غضون فترة محددة من الزمن، افترض الخادم قد مات والرد وفقا لذلك. أخشى أنا لا أعرف C / C ++، ولكن يمكنك استخدام خيوط المعالجة المتعددة لاطلاق البيان ثم انتظر الرد، دون شنقا الطلب؟

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

إذا قمت بتكوين SQL * NET لاستخدام مهلة ربما كنت سوف تلاحظ أن ستفشل الاستفسارات كبيرة بسبب ذلك. سوف التكوين set_timeout OCI أيضا أن يسبب هذا.

وهناك طريقة يدوية لتجنب هذا. يمكنك فتح جدار الحماية وتفعل شيئا مثل قاعدة بيانات بينغ بعد كل مدة محددة من الزمن. وبهذه الطريقة اتصال قاعدة البيانات لن تضيع.

وفكرة

If (current_time - lastPingTime > configuredPingTime)
{
     //Dummy query
     select 1 from dual;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top