2013-02-14 7 views
10

हमारे पास बीस मॉड्यूल के साथ एक पायथन एप्लिकेशन है, जिनमें से अधिकांश कई वेब और कंसोल अनुप्रयोगों द्वारा साझा किए जाते हैं।मुझे बहु-मॉड्यूल पायथन ऐप में डेटाबेस कनेक्शन कैसे स्थापित और प्रबंधित करना चाहिए?

मुझे बहु मॉड्यूल पायथन ऐप्स में डेटाबेस कनेक्शन की स्थापना और प्रबंधन के लिए सर्वोत्तम अभ्यास की स्पष्ट समझ नहीं मिली है। इस उदाहरण पर विचार करें:

मेरे पास उपयोगकर्ताओं के लिए ऑब्जेक्ट क्लास को परिभाषित करने वाला एक मॉड्यूल है। डेटाबेस में उपयोगकर्ताओं को बनाने/हटाने/अपडेट करने के लिए इसमें कई डीफ़ हैं। User.py मॉड्यूल को एक कंसोल आधारित उपयोगिता में आयात किया जाता है, 2) एक वेब.py आधारित वेब अनुप्रयोग और 3) लगातार चलने वाली डिमन प्रक्रिया।

इन तीनों में से प्रत्येक एप्लिकेशन में अलग-अलग जीवन चक्र होते हैं। डिमन एक कनेक्शन खोल सकता है और इसे खोल सकता है। कंसोल यूटिलिटी कनेक्ट करता है, काम करता है, फिर मर जाता है। बेशक http अनुरोध परमाणु हैं, हालांकि वेब सर्वर एक डिमन है।

मैं वर्तमान में उपयोगकर्ता वर्ग में प्रत्येक फ़ंक्शन के अंदर कनेक्शन बंद करने का उपयोग कर खोल रहा हूं। यह सबसे अक्षम लगता है, लेकिन यह सभी उदाहरणों में काम करता है। परीक्षण के रूप में उपयोग किया जाने वाला एक विकल्प पूरे मॉड्यूल के लिए वैश्विक कनेक्शन घोषित करना और खोलना है। एक और विकल्प शीर्ष अनुप्रयोग परत पर कनेक्शन बनाना होगा और कक्षाओं को तुरंत चालू करते समय संदर्भों को पास करना होगा, लेकिन यह मेरे लिए सबसे बुरा विचार है।

मुझे पता है कि प्रत्येक एप्लिकेशन आर्किटेक्चर अलग है। मैं बस सोच रहा हूं कि क्या कोई अच्छा अभ्यास है, और यह क्या होगा?

+0

इस [प्रश्न] के अनुसार कनेक्शन पूलिंग देखें (http://stackoverflow.com/questions/98687/what-is-the-best-solution-for-database-connection-pooling-in-python) – Mark

उत्तर

9

सबसे अच्छा तरीका है जब आपको कुछ ऑपरेशन करने की आवश्यकता होती है (जैसे डेटा प्राप्त करना और/या अपडेट करना); डेटा में हेरफेर करें; में एक प्रश्न (प्रदर्शन के लिए बहुत महत्वपूर्ण) में डेटाबेस पर वापस लिखें, और फिर कनेक्शन बंद करें। कनेक्शन खोलना काफी हल्की प्रक्रिया है।

प्रदर्शन के लिए कुछ नुकसान शामिल

  • डेटाबेस खोलने जब आप निश्चित रूप से इसे
  • चयनकर्ताओं है कि और अधिक डेटा ले से आप (उदाहरण के लिए, सभी उपयोगकर्ताओं के बारे में हो रही डेटा की जरूरत है और यह छानने का उपयोग कर के साथ बातचीत नहीं करेगा पाइथन में, बेकार डेटा को फ़िल्टर करने के लिए MySQL से पूछने के बजाय)
  • लिखने वाले मान जो नहीं बदले हैं (उदाहरण के लिए उपयोगकर्ता प्रोफ़ाइल के सभी मूल्यों को अपडेट करना, जब उनका ईमेल बदल गया हो)
  • प्रत्येक फ़ील्ड सर्वर को अद्यतन करता है व्यक्तिगत रूप से (ई .g, डीबी खोलें, उपयोगकर्ता को अपडेट करें, डीबी बंद करें, डीबी खोलें, यूजर पासवर्ड अपडेट करें, डीबी बंद करें, ओपन वें ... आपको विचार मिल गया है)

नीचे की रेखा है इससे कोई फर्क नहीं पड़ता कि आप डेटाबेस को कितनी बार खोलते हैं, यह आपके द्वारा चलाए जाने वाले कई प्रश्न हैं। यदि आप अपने प्रश्नों को संबंधित प्रश्नों में शामिल होने के लिए प्राप्त कर सकते हैं, तो आपने युद्ध जीता है।

+0

यह जो मैं खोज रहा था, वह मेरा सबसे अच्छा अनुमान है, और इसका मतलब है कि मुझे कुछ भी फिर से काम नहीं करना है! अतिरिक्त युक्तियों के लिए धन्यवाद - मैं पहले से ही ऐसा कर रहा हूं लेकिन यह एक अच्छी चेकलिस्ट थी। – hikaru

4

MySQL कनेक्शन अपेक्षाकृत तेज़ हैं, इसलिए यह कोई समस्या नहीं हो सकती है (यानी आपको मापना चाहिए)। कनेक्शन बनाने के लिए अधिकांश अन्य डेटाबेस अधिक संसाधन लेते हैं।

जब आपको आवश्यकता होती है तो एक नया कनेक्शन बनाना हमेशा सुरक्षित होता है, और यह एक अच्छा पहला विकल्प है। कुछ डीबी पुस्तकालय, उदा। SqlAlchemy, उस में निर्मित कनेक्शन पूल हैं जो पारदर्शी रूप से आपके लिए कनेक्शन का पुन: उपयोग करेंगे।

आप तय करते हैं कि आप एक कनेक्शन जिंदा रखना चाहते हैं ताकि आप कर सकते हैं इसे फिर से उपयोग करते हैं, कुछ बिंदुओं के बारे में पता होना करने के लिए देखते हैं:

  1. कनेक्शन है कि केवल पढ़ने के लिए उपयोग किया जाता है के लिए आसान होती कनेक्शन से पुनः उपयोग करें जिसे आपने डेटाबेस डेटा को संशोधित करने के लिए उपयोग किया है।

  2. जब आप किसी कनेक्शन पर लेनदेन शुरू करते हैं, तो सावधान रहें कि आप इसका उपयोग करते समय किसी और चीज़ के लिए उस कनेक्शन का उपयोग नहीं कर सकते हैं।

  3. कनेक्शन जो लंबे समय तक घूमते हैं, वे बाँधते हैं और आपके नीचे से बंद किए जा सकते हैं, इसलिए यदि आप कनेक्शन का दोबारा उपयोग कर रहे हैं तो आपको यह जांचना होगा कि यह अभी भी "जीवित" है, उदाहरण के लिए "चयन 1" भेजकर और यह सत्यापित करना कि आपको परिणाम मिल रहा है।

मैं व्यक्तिगत रूप से अपने स्वयं के कनेक्शन पूलिंग एल्गोरिदम को लागू करने के खिलाफ अनुशंसा करता हूं। चीजें गलत होने पर डीबग करना वाकई मुश्किल है। इसके बजाय एक डीबी लाइब्रेरी चुनें जो आपके लिए करता है।

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