2009-08-30 9 views
6

मैं Django 1.1 का उपयोग MySQL 5. * और MyISAM तालिकाओं के साथ कर रहा हूं।Django: आप अपने डेटाबेस को मारने से लंबे प्रश्नों को कैसे रोक सकते हैं?

मेरे कुछ प्रश्न मेरे डेटा सेट में आउटलाइन के लिए समय का समय ले सकते हैं। ये टेबल लॉक करते हैं और साइट को बंद करते हैं। अन्य बार ऐसा लगता है कि कुछ उपयोगकर्ता इसे पूरा करने से पहले अनुरोध रद्द कर देते हैं और कुछ प्रश्न "तैयारी" चरण में फंस जाएंगे, अन्य सभी प्रश्नों को लॉक कर दें।

मैं सभी कोने के मामलों को ट्रैक करने की कोशिश करने जा रहा हूं, लेकिन सुरक्षा नेट होने के लिए यह अच्छा है इसलिए साइट नीचे नहीं आती है।

मैं इससे कैसे बचूं? क्या मैं अधिकतम क्वेरी समय निर्धारित कर सकता हूं?

+0

डेटा सेट में एक बाहरी क्या है? – hughdbrown

+0

कोई व्यक्ति जो उपलब्धियों की सामान्य संख्या से बड़ा है, या वेब पर वास्तव में बड़ी संख्या में उपनाम हैं। –

उत्तर

1

दुर्भाग्य से MySQL आपको इससे बचने का एक आसान तरीका नहीं देता है। एक सामान्य विधि मूल रूप से एक स्क्रिप्ट लिखने के लिए होती है जो प्रत्येक एक्स सेकेंड की सभी चल रही प्रक्रियाओं को जांचती है (जो आपको लगता है कि "लंबा" है) और इसे देखकर मारने वाले लोगों को मारना बहुत लंबा चल रहा है। हालांकि, आप कम से कम कुछ बुनियादी निदान प्राप्त कर सकते हैं, हालांकि, MySQL में log_slow_queries सेट करके जो सभी प्रश्नों को लिख देगा जो लॉग में 10 सेकंड से अधिक समय लेते हैं। यदि आप अपने उद्देश्यों के लिए "धीमे" के रूप में देखते हैं, तो आप long_query_time को थ्रेसहोल्ड बदलने के लिए 10 के अलावा किसी अन्य मान पर सेट कर सकते हैं।

+1

* श्वास * मैं इससे डरता था। क्या ऐसी कोई स्क्रिप्ट है जिसे आप इस नौकरी के लिए अनुशंसा करते हैं? –

+0

क्या आपको यह करने के लिए कोई स्क्रिप्ट मिली? – lamplighter

0

ऐसा लगता है कि एक प्रश्न को रद्द करने का एकमात्र विश्वसनीय तरीका kill command है। कनेक्शन को बंद करने के लिए एक कम कठोर उपाय है (और एक नया खोलें); जैसे ही वे ग्राहक को send some output पर आज़माते हैं, यह प्रश्नों को समाप्त कर देगा।

+1

मैं django में इसका पता कैसे लगा सकता हूं?मैं एक cronjob नहीं होगा जो यह देखने के लिए हर दूसरे की जांच करता है कि उसे क्या मारना है ... –

0

क्या आप जानते हैं कि प्रश्न क्या हैं? हो सकता है कि आप एसक्यूएल को अनुकूलित कर सकें या अपनी टेबल पर कुछ इंडेक्स डाल सकें?

+0

निश्चित रूप से, मैं प्रश्नों पर काम कर रहा हूं। मुझे लगभग 4 मिल गया है जो डीबी को मारता है। लेकिन मुझे एक सुरक्षा नेट चाहिए ताकि कोई प्रश्न न हो जो मेरे डीबी को लॉक कर और साइट को मार सके। –

1

मैं एक Django डीबी-प्रतिकृति ऐप कर रहा हूं और एक ही समस्या है, एक वैन भर में प्रश्न कभी-कभी नेटवर्क विलंबता बढ़ने पर लटका लग सकता है।

से http://code.activestate.com/recipes/576780/

पकाने की विधि 576,780: टाइम आउट (लगभग) किसी भी प्रतिदेय

एक समय बनाएँ सीमित किसी भी प्रतिदेय के संस्करण के लिए।

उदाहरण के लिए, f को टी सेकेंड में सीमित करने के लिए, पहले f का समय सीमित संस्करण बनाएं।

from timelimited import * 

f_t = TimeLimited(f, t) 

फिर, बजाय f(...) लागू की, जैसे

try: 
    r = f_t(...) 
except TimeLimitExpired: 
    r = ... # timed out 

f_t का उपयोग यह उदाहरण के लिए निम्नलिखित तरीके का उपयोग करें:

def _run_timed_query(cursor, log_msg, timeout, query_string, *query_args): 
    """Run a timed query, do error handling and logging""" 
    import sys 
    import traceback 
    from timelimited import * 

    try: 
     return TimeLimited(cursor.execute, timeout)(query_string, *query_args) 
    except TimeLimitExpired: 
     logger_ec.error('%s; Timeout error.' % log_msg) 
     raise TimeLimitExpired 
    except: 
     (exc_type, exc_info, tb) = sys.exc_info() 
     logger_ec.error('%s; %s.' % (log_msg, traceback.format_exception(exc_type, exc_info, None)[0])) 
     raise exc_type 
0

उपयोग InnoDB टेबल्स, वे row-locking बजाय table-locking है।

+0

मैंने ऐसा किया, लेकिन मैं ज्यादातर पढ़ता हूं, और इनओडीबी मेरे क्वेरी लोड के लिए परिमाण की मंदी का आदेश था :( –

0

आपको ऐसे प्रश्न नहीं लिखना चाहिए, कम से कम अपने लाइव डेटाबेस के विरुद्ध नहीं चलना चाहिए। माईस्क्ल में एक "धीमी क्वेरी" पैरामीटर है जिसका आप उपयोग कर रहे प्रश्नों की पहचान करने के लिए उपयोग कर सकते हैं। अधिकांश समय, ये धीमी क्वेरी या तो छोटी होती हैं या एक नई अनुक्रमणिका या दो परिभाषित करके तेज हो सकती हैं।

संबंधित मुद्दे

 संबंधित मुद्दे