2009-12-17 10 views
5

मैं हाल ही में कई अलग-अलग ग्राहकों द्वारा कई लगातार कनेक्शनों की सेवा के लिए टोरनाडो वेब ढांचे की खोज कर रहा हूं।टोरनाडो वेब फ्रेमवर्क MySQL कनेक्शन हैंडलिंग

मेरे पास एक अनुरोध हैंडलर है जो मूल रूप से एक आरएसए एन्क्रिप्टेड स्ट्रिंग लेता है और इसे डिक्रिप्ट करता है। डिक्रिप्ट टेक्स्ट एक एक्सएमएल स्ट्रिंग है जिसे मैंने लिखा है एक एसएक्स दस्तावेज़ हैंडलर द्वारा पार्स किया जाता है। सब कुछ पूरी तरह से ठीक काम करता है और निष्पादन समय (प्रति HTTP अनुरोध) लगभग 100 मिलीसेकंड (डिक्रिप्शन और पार्सिंग के साथ) था।

एक्सएमएल में उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड हैश है। मैं यह सत्यापित करने के लिए एक MySQL सर्वर से कनेक्ट करना चाहता हूं कि उपयोगकर्ता नाम एप्लिकेशन द्वारा प्रदान किए गए पासवर्ड हैश से मेल खाता है।

जब मैं मूल रूप से निम्न कोड जोड़ें:

conn = MySQLdb.connect (host = "192.168.1.12", 
       user = "<useraccount>", 
       passwd = "<Password>", 
       db = "<dbname>") 
    cursor = conn.cursor() 

    safe_username = MySQLdb.escape_string(XMLLoginMessage.username) 
    safe_pass_hash = MySQLdb.escape_string(XMLLoginMessage.pass_hash) 

    sql = "SELECT * FROM `mrad`.`users` WHERE `username` = '" + safe_username + "' AND `password` = '" + safe_pass_hash + "' LIMIT 1;" 

    cursor.execute(sql) 

      cursor.close() 
    conn.close() 

समय यह निष्पादित करने के लिए HTTP अनुरोध 4 तक चढ़ जाता है लेता है - 5 सेकंड! मेरा मानना ​​है कि यह माइस्क्ल डेटाबेस डेटाबेस से कनेक्ट होने में लगने वाले समय में किया जाता है।

मेरा सवाल यह है कि मैं इसे कैसे गति दे सकता हूं? क्या मैं वैश्विक दायरे में MySQL कनेक्शन घोषित कर सकता हूं और अनुरोधकर्ता हैंडलर में नया कर्सर बनाकर एक्सेस कर सकता हूं, या टोरनाडो के असीमित डिजाइन के कारण यह समवर्ती मुद्दों में भाग लेगा?

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

और कृपया ध्यान रखें, एसक्यूएल सर्वर तूफान वेब सर्वर उदाहरण

अद्यतन

मैं बस एक साधारण MySQL क्वेरी एक प्रोफाइलर के माध्यम से एक ही कोड के नीचे भाग गया, के रूप में एक ही भौतिक मशीन पर वास्तव में है।

'कनेक्शन.py' init फ़ंक्शन को अकेले निष्पादित करने के लिए 4.944 सेकेंड लग गए। यह सही प्रतीत नहीं होता है, है ना?

अद्यतन 2

मुझे लगता है कि एक कनेक्शन (या एक बहुत ही सरल डीबी Conn पूल के साथ भी कुछ) के साथ चल काफी तेजी से प्रवाह मैं प्रति बवंडर वेब सर्वर उदाहरण की उम्मीद कर रहा हूँ संभालने के लिए किया जाएगा।

1,000 ग्राहकों एक प्रश्न का उपयोग करने की जरूरत है, विशिष्ट क्वेरी बार सेकंड के हजारों में जा रहा है, unluckiest ग्राहक केवल एक दूसरे प्रतीक्षा करने के लिए डेटा पुनः प्राप्त करने के लिए होगा।

+0

5 सेकंड डेटाबेस कनेक्शन से संबंधित हो सकते हैं, न कि वास्तविक क्वेरी, यदि आप टॉरनाडो का उपयोग कर रहे हैं तो आप वैश्विक स्तर पर डीबी से कनेक्शन कर सकते हैं और फिर अनुरोध के साथ डीबी पैरामीटर पास कर सकते हैं। – chuseuiti

उत्तर

1

SQLAlchemy, जो DBAPI पर एक अच्छे अमूर्त प्रदान करता है पर विचार करें और भी कनेक्शन प्रदान करता है पूलिंग, आदि(आप खुशी से अपने ORM अनदेखा कर सकते हैं और बस का उपयोग एसक्यूएल-Toolkit)

(इसके अलावा, आप नहीं अतुल्यकालिक अनुरोध संचालकों में डेटाबेस कॉल को अवरुद्ध कर रहे हैं?)

+0

मुझे पता है कि मैं उपरोक्त कोड में अवरुद्ध कॉल नहीं कर रहा हूं, अगर आप यही पूछ रहे हैं, तो मैंने अभी उदाहरण में कोई भी शामिल नहीं किया है। आखिरकार, वहां होगा, लेकिन कनेक्शन समय मुझे क्या मिल रहा है। मुझे विश्वास है कि मैं स्क्लेक्लेमी को एक कोशिश देने जा रहा हूं, इसलिए आपके उत्तर के लिए धन्यवाद! –

1

एक SQL कनेक्शन 5 सेकंड नहीं लेना चाहिए। जो यह होना चाहिए - एक प्रश्न जारी और देखते हैं कि कि प्रदर्शन में कोई नहीं की कोशिश करें।

Mysqldb मॉड्यूल धागा सुरक्षित है "1", जो मॉड्यूल का मतलब है की एक threadsafety है, लेकिन कनेक्शन धागे के बीच साझा नहीं किया जा सकता। आप एक कनेक्शन पूल को वैकल्पिक के रूप में कार्यान्वित कर सकते हैं।

अन्त में, DBAPI प्रश्नों जो मैन्युअल रूप से की आवश्यकता नहीं होगी एक प्रश्न श्रृंखलाबद्ध और मानकों से बचने के लिए एक पैरामीटर प्रतिस्थापन रूप है:

cur.execute("SELECT * FROM blach WHERE x = ? AND y = ?", (x,y)) 
+0

ठीक है, मुझे ऑटो-पैरामीटरेशन सामग्री के बारे में पता नहीं था, जो वास्तव में सहायक होगा। मैं कल क्वेरी को हटाने में देखता हूं और देखता हूं कि यह मुझे कहां छोड़ देता है। मुझे लगता है कि मुझे एक कनेक्शन पूल लिखना होगा ... सिर्फ इसलिए कि संभावना है कि डीबी की कॉल अन्य धागे को अवरुद्ध करेगी। यह परीक्षण में होगा कि क्या मैं ऐसा करने का फैसला करता हूं या नहीं। –

0

आधार हैंडलर में यह घोषणा, यह प्रति आवेदन एक बार बुलाया जाना चाहिए।

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