2012-02-15 13 views
7

मैंने AJAX लंबे मतदान और गीवेंट का उपयोग करके चैट लागू की। पढ़ने के लिए, क्लाइंट अद्यतन दृश्य को अजाक्स करें और अद्यतन के लिए Gevent.event.wait के साथ प्रतीक्षा करें।डीजेगो, अजाक्स लंबे मतदान, पोस्टग्रेस्क्ल: निष्क्रिय लेनदेन

समस्या: अनुरोध के अंत तक (सत्र जानकारी प्राप्त करने के लिए) Django द्वारा पोस्ट किया गया पोस्टग्रेस्क्ल लेनदेन अनुरोध के अंत तक बंद नहीं होता है। और उन निष्क्रिय लेनदेन में बहुत मेमोरी होती है।

अनुरोध बंद किए बिना पोस्टग्रेस्क्ल लेनदेन को बंद करने का सबसे साफ तरीका क्या होगा? मैं वर्तमान में अनुरोध_फिनिश सिग्नल मैन्युअल रूप से भेज रहा हूं लेकिन यह एक हैक जैसा लगता है।

उत्तर

2

जिस तरह से आप इसे कर रहे हैं वैसे भी आपके हैक के ढांचे के भीतर सबसे अच्छा तरीका है। क्या कोई कारण है कि आप django-socketio जैसे कुछ उपयोग करने के बजाय अनुरोध-प्रतिक्रिया प्रक्रिया में जूता-सींग लंबे मतदान की कोशिश कर रहे हैं?

+0

हमने गीवेन्ट/गनिकोर्न/अपाचे (बैक एंड) के साथ nginx (फ्रंट एंड) के माध्यम से सॉकेटियो काम करने की कोशिश करने में काफी समय लगाया। Nginx उच्च मात्रा में मोड के बिना ऐसा करने में सक्षम नहीं है। और यहां तक ​​कि उन लोगों के साथ, हम docketango सत्र आईडी के साथ सॉकेटियो उपयोगकर्ता आईडी को लिंक करने में सक्षम नहीं थे, इसलिए हम उपयोगकर्ता की जानकारी प्राप्त करने में सक्षम नहीं थे। यदि आपके पास अनुशंसा करने के लिए एक पूर्ण ट्यूटोरियल है, तो हम इसे देखना पसंद करेंगे। अधिकांश सॉकेटियो - हमने पाया चैट ट्यूटोरियल, django उपयोगकर्ता जानकारी या सामने के अंत का उपयोग न करें। – Ashe

+1

जहां तक ​​सॉकेटियो और डीजेंगो ऑथ बैकएंड्स एक साथ काम करते हैं: https://gist.github.com/fd8e9631368e447de702 –

+0

ईमानदार होने के लिए, हम अभी रोलबैक नहीं करेंगे, लेकिन हम निश्चित रूप से बाद में इसे बनाए रखेंगे। धन्यवाद। – Ashe

0

यहाँ देखें: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

@transaction.commit_manually 
def yourview(request): 
    # do your db actions 
    transaction.commit() 

या यदि आप संदर्भ प्रबंधकों पसंद करते हैं:

def yourview(request): 
    ... 
    with transaction.commit_manually(): 
     # do your db actions 
    ... 

इसके अलावा, आप PostgreSQL कनेक्शन पकड़े स्मृति समस्या है तो खोलने आप pgbouncer का उपयोग कर एक पूलिंग समाधान दिखना चाहिए या मौजूद विभिन्न भूवैज्ञानिक कनेक्शन पूल। आपको ऐसा करने से कुछ बड़े प्रदर्शन लाभ देखना चाहिए।

+0

हमने रोलबैक के साथ प्रयास किया, हम प्रतिबद्धता के साथ एक परीक्षण करेंगे और अगर यह काम करता है तो उत्तर को मान्य करेगा। और आपके द्वारा अनुशंसित तकनीकों पर नज़र डालें। जवाब के लिए धन्यवाद! – Ashe

+0

यह हमारे लिए काम नहीं कर रहा है। मुझे लगता है कि प्रतिबद्धता के भीतर खोला गया लेनदेन और पहले डीजेंगो द्वारा खोला गया एक ही नहीं है (या ऐसा कुछ है जिसे हम समझ में नहीं आते हैं)। जब भी हम अपने (बदसूरत) हैक के बजाय इस तकनीकी का उपयोग करते हैं, तब भी हमारे पास निष्क्रिय कनेक्शन होता है। – Ashe