2011-03-24 12 views
8

हमारे पास पोस्टग्रेस्क्ल 9.0 पर चलने वाला एक सुंदर ठेठ django ऐप है। हमने हाल ही में कुछ इंटरफ़ेस इंटरफ़ेस में अक्षम खोजों के कारण 4 घंटे से अधिक समय तक चलने वाले कुछ डीबी प्रश्नों की खोज की है। हालांकि हम इन प्रश्नों को ठीक करने की योजना बना रहे हैं, एक सुरक्षा के रूप में हम कृत्रिम रूप से डेटाबेस क्वेरी समय को 15 सेकंड तक सीमित करना चाहते हैं - लेकिन केवल वेब अनुरोध के संदर्भ में; इस बाधा से बैच नौकरियों और अजवाइन कार्यों को बाध्य नहीं किया जाना चाहिए।वेब अनुरोधों के दौरान मैं डेटाबेस क्वेरी समय को कैसे सीमित कर सकता हूं?

हम यह कैसे कर सकते हैं? या यह एक भयानक विचार है? क्वेरी के लिए, और एक टाइमर के लिए एक:

उत्तर

20

यह करने के लिए एक भूमिका स्थापित करने के लिए सबसे अच्छा तरीका होगा/उपयोगकर्ता है कि केवल वेब अनुरोध को चलाने के लिए प्रयोग किया जाता है, तो उस भूमिका पर statement_timeout सेट ।

ALTER ROLE role_name SET statement_timeout = 15000 

अन्य सभी भूमिकाएं कथन_टाउटआउट (जो स्टॉक इंस्टॉल में अक्षम है) की वैश्विक सेटिंग का उपयोग करेगी।

+0

+ 1 अच्छा विकल्प। बस याद रखें कि उपयोगकर्ता उच्च सत्र के साथ एक ही कमांड जारी करके अपने सत्र के लिए इसे रीसेट कर सकता है। एक वेब कॉल के साथ मुझे लगता है कि यह कोई मुद्दा नहीं होगा हालांकि उपयोगकर्ता को इसे सेट करने के लिए इंटरफ़ेस नहीं होगा। – Kuberchaun

+0

मैथ्यू वुड: वाह, क्या एक अच्छा सुझाव है। धन्यवाद। स्टारशिप 3000: यह उत्तर तकनीकी समस्या हल करता है, जिसकी मुझे परवाह है। आपके द्वारा उठाई गई समस्या तकनीकी समस्या नहीं है, यह एक मानव संसाधन समस्या है। वे हल करने के लिए आसान हैं। –

+0

ग्रेट सॉल्यूशन! उसके लिये आपका धन्यवाद। आप 'सेट सत्र कथन_टाउटआउट = 15000;' भी जारी कर सकते हैं; यदि आप केवल एक विशिष्ट सत्र को सीमित करना चाहते हैं, या यहां तक ​​कि 'स्थानीय कथन_टाउटआउट = 15000 सेट करें;'। अधिक जानकारी: http://www.postgresql.org/docs/9.5/static/runtime-config-client.html#GUC-STATEMENT-TIMEOUT –

-4

जहां तक ​​समय चला जाता है, तो आप एक वर्ग है, जो इन्स्टेन्शियशन पर, दो धागे spawns के माध्यम से अपने प्रश्नों के सभी दे सकते हैं। यदि टाइमर 15 सेकंड तक पहुंचता है, तो क्वेरी के साथ धागे को मार दें।

जहाँ तक पता लगाना यदि क्वेरी एक वेब अनुरोध से instantiated है के रूप में, मैं काफी पता नहीं Django के बारे में आपकी मदद करने में सक्षम होना है। Simplistically, मैं कहूंगा कि, अपने वर्ग है कि अपने डेटाबेस कॉल हैंडल में, निर्माता के लिए एक वैकल्पिक पैरामीटर context की तरह कुछ है, जो एक वेब अनुरोध और कुछ और के लिए "" की स्थिति में http हो सकता है हो सकता है।

+0

यह एक बहुत ही ओवर-इंजीनियर संभावित नुकसान की टन के साथ समस्या का हल है, और जो डेटाबेस प्रणाली मूल रूप से एक संभाल का काम कर रहे। – Fleep

0

आपको इसे मैन्युअल रूप से संभालने की आवश्यकता होगी। यह 15 दूसरे नियम की जांच कर रहा है और उन प्रश्नों को मार रहा है जो इसका उल्लंघन करते हैं।

क्वेरी pg_stat_activity और उल्लंघनकर्ताओं और इस मुद्दे को लगता है (procpid) pg_terminate_backend को अपराधियों को मारने के लिए कहता है। एक पाश में

कुछ इस तरह:

SELECT pg_terminate_backend(pg_stat_activity.procpid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB' 
    AND usename = 'WEBUSERNAME' 
    AND (now()-query_start) > '00:00:15'; 
+0

यह निश्चित रूप से आपको वेब इंटरफ़ेस का उपयोग करने वाले खातों के नामों के बारे में बताता है। यद्यपि यदि आपके पास अपने वेबसर्वर बॉक्स से आईपी पते की एक सूची है, तो आप उन लोगों का भी उपयोग कर सकते हैं। Pg_stat_activity तालिका देखें। – Kuberchaun

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

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