سؤال

ما هي الطريقة الصحيحة للتحكم في المهلات، من العميل، عند التشغيل على قاعدة بيانات MySQL، باستخدام SQLAlchemy؟ال connect_timeout يبدو أن معلمة URL غير كافية.

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

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

ليس من المستغرب أن wait_timeout متغير الجلسة لا يعمل، لأنني أعتقد أن هذا متغير من جانب الخادم.لكنني ألقيتها هناك فقط للتأكد.

from sqlalchemy import *
from sqlalchemy.exc import *
import time
import sys

engine = create_engine("mysql://user:password@somehost/test?connect_timeout=1")
try:
    engine.execute("set session wait_timeout = 1;")
    while True:
        t = time.time()
        print t
        engine.execute("show tables;")
except DBAPIError:
    pass
finally:
    print time.time() - t, "seconds to time out"
هل كانت مفيدة؟

المحلول

هذا غير ممكن بسبب الطريقة التي يعمل بها TCP.إذا توقف الكمبيوتر الآخر عن الشبكة، فسوف يتوقف ببساطة عن الاستجابة للحزم الواردة."18 ثانية" التي تراها هي شيء في مهلة مكدس TCP الخاص بك بسبب عدم وجود استجابة.

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

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

نصائح أخرى

هل يمكن أن يكون هذا خطأً في موصل mysql/python؟https://bugs.launchpad.net/myconnpy/+bug/328998والتي تقول أن المهلة مشفرة بـ 10 ثوانٍ.

لمعرفة مكان الانهيار حقًا، يمكنك استخدام أداة شم الحزم للتحقق من المحادثة بين الخادم والعميل.يعمل wireshark + tcpdump بشكل رائع مع هذا النوع من الأشياء.

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

إذا لم تتمكن/لم تتمكن من التحديث لسبب ما، فيجب عليك تجربة إصلاح SA لهذا الغرض

db= create_engine('mysql://root@localhost/test', pool_recycle=True) 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top