2012-08-09 10 views
7

मैं पाइथन (फ्लास्क का उपयोग करके) में एक वेब ऐप बना रहा हूं। मैं SQLAlchemy या इसी तरह की ओआरएम प्रणाली का उपयोग करने का इरादा नहीं रखता, बल्कि मैं सीधे साइकोप 2 का उपयोग करने जा रहा हूं।क्या पोस्टग्रेएसक्यूएल कनेक्शन को पाइथन वेब ऐप में पूल किया जाना चाहिए, या प्रति अनुरोध एक नया कनेक्शन बनाना चाहिए?

क्या मुझे प्रत्येक नए अनुरोध के लिए एक नया डेटाबेस कनेक्शन खोलना चाहिए (और बाद में इसे बंद करें)? या क्या मुझे इन कनेक्शनों को पूल करने के लिए कुछ उपयोग करना चाहिए?

उत्तर

9

पीजी बाउंसर एप्लिकेशन और सर्वर के लिए काफी साफ और पारदर्शी है।

हम बिना किसी मुद्दे के 2 साल तक उत्पादन में पीजीबाउंसर का उपयोग कर रहे हैं। यह एक बहुत ही बढ़िया PostgreSQL कनेक्शन पूलर है।

http://wiki.postgresql.org/wiki/PgBouncer

1

मुझे लगता है कि यदि यह एप्लिकेशन एकाधिक ग्राहकों और समवर्ती रूप से सेवा प्रदान करता है तो कनेक्शन पूलिंग सबसे अच्छी बात है।

2

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

1

हाँ कनेक्शन पूलिंग मदद करेगा, लेकिन हाँ, आपको लाइव कनेक्शन या पूल आकार के लिए सही संख्याएं मिलनी होंगी, जिसके आधार पर डेटाबेस पर लोड होगा।

from psycopg2.pool import SimpleConnectionPool 
    from contextlib import contextmanager 

    dbConnection = "dbname='dbname' user='postgres' host='localhost' password='postgres'" 

    # pool define with 10 live connections 
    connectionpool = SimpleConnectionPool(1,10,dsn=dbConnection) 

    @contextmanager 
    def getcursor(): 
     con = connectionpool.getconn() 
     try: 
      yield con.cursor() 
     finally: 
      connectionpool.putconn(con) 

    def main_work(): 
     try: 
      # with here will take care of put connection when its done 
      with getcursor() as cur: 
       cur.execute("select * from \"TableName\"") 
       result_set = cur.fetchall() 

     except Exception as e: 
      print "error in executing with exception: ", e 
संबंधित मुद्दे