2012-06-12 22 views
6

Sto usando la versione standard (al contrario di NonRel) di Django collegata a PostgreSQL su Apache + mod_wsgi. Questa configurazione si collega anche a MongoDB (alcuni dati vengono salvati esternamente). In questo momento devo creare una nuova connessione MongoDB per ogni richiesta Django e trasferirla lungo lo stack di chiamate a tutte le funzioni che richiedono l'accesso a MongoDB. C'è un modo per mettere in cache le connessioni tra le richieste?Caching connessioni MongoDB in Django

Modifica

A rischio di blasfemia, sarebbe un'opera variabile globale in questo caso?

+0

Per chiarire, presumo che intendi il caching sul lato del django, è corretto? –

+0

Sì. Vuoi evitare di creare una nuova connessione in Django su ogni richiesta. –

risposta

4

Ci sono diversi modi che spiegano come pymongo possono lavorare (o non) con mod_wsgi, ha suggerito qui: http://api.mongodb.org/python/current/faq.html?highlight=wsgi#does-pymongo-work-with-mod-wsgi

Inoltre è possibile utilizzare un qualche tipo di soluzione di pooling, come descritto qui: http://www.mongodb.org/display/DOCS/Notes+on+Pooling+for+Mongo+Drivers

Un progetto che so già che il raggruppamento è MongoEngine, è un ORM molto semplice che usa il pymongo dietro le quinte. Potresti volerlo esaminare insieme alle soluzioni pymongo faq qui sopra.

+0

MongoEngine non è un'opzione perché A) non è molto stabile per quanto ho capito, e B) mi richiede di abbandonare il backend SQL esistente. Ho bisogno di una soluzione ibrida. –

+5

MongoEngine è abbastanza stabile, da quello che ho vissuto. E non richiede di abbandonare nulla, a meno che tu non voglia. – Evgeny

+0

Grazie per l'avviso relativo al problema noto con le estensioni C. Anche se non ha davvero a che fare con le connessioni di caching. Anche il raggruppamento è un'opzione, ma solo se è davvero possibile riutilizzare le connessioni tra le richieste, il che non è ancora chiaro per me. –

2

Puoi istanziare la connessione MongoDB da qualche parte e importarla invece di chiamare pymongo.connection.Connection() ogni volta che ne hai bisogno. Oppure puoi creare un Singleton per farlo. Qualcosa di simile a settings.py.

class ConnectionSingleton(object): 
    """Represents a MongoDB connection""" 
    conn=None 
    def __new__(cls,*args,**kwds): 
     if cls.conn is None: 
      cls.conn=pymongo.connection.Connection() 
     return cls.conn 

Questo non risolve il problema?

+1

Poiché pymongo afferma che è thread-safe e fa il connection pooling all'interno della sua classe Connection a questo punto sembra che io possa solo dichiarare la connessione all'interno della vista, o addirittura nel file delle impostazioni, e "funzionerà", anche quando si accede da più thread sotto wsgi. Il progetto di esempio di Pymongo sembra fare proprio questo: https://github.com/mdirolf/DjanMon/blob/master/status/views.py –

Problemi correlati