2012-06-12 11 views
6

Estoy usando la versión estándar (en lugar de NonRel) de Django conectada a PostgreSQL en la parte superior de Apache + mod_wsgi. Esta configuración también se conecta a MongoDB (algunos datos se guardan externamente). Ahora mismo tengo que crear una nueva conexión MongoDB para cada solicitud de Django, y pasarla a lo largo de la pila de llamadas a todas las funciones que requieren acceso a MongoDB. ¿Hay alguna manera de almacenar en caché las conexiones entre las solicitudes?Almacenamiento en caché de conexiones de MongoDB en Django

sería Editar

A riesgo de blasfemia, una obra variable global en este caso?

+0

Para aclarar, supongo que se refiere al almacenamiento en caché en el lado django, ¿es correcto? –

+0

Sí. Desea evitar crear una nueva conexión en Django en cada solicitud. –

Respuesta

4

Hay varias maneras que explican cómo pymongo pueden trabajar (o no) con mod_wsgi, aquí sugeridas: http://api.mongodb.org/python/current/faq.html?highlight=wsgi#does-pymongo-work-with-mod-wsgi

Además puede utilizar algún tipo de solución puesta en común, como se describe aquí: http://www.mongodb.org/display/DOCS/Notes+on+Pooling+for+Mongo+Drivers

Uno de los proyectos que ya sé que tiene una agrupación es MongoEngine, es un ORM muy simple que utiliza Pymongo detrás de las escenas. Es posible que desee examinarlo junto con las soluciones de preguntas frecuentes pymongo anteriores.

+0

Mongo Engine no es una opción porque A) no es muy estable por lo que yo entiendo, y B) me exige abandonar el back-end SQL existente. Necesito una solución híbrida. –

+5

MongoEngine es bastante estable, por lo que experimenté. Y no requiere que abandones nada, a menos que quieras. – Evgeny

+0

Gracias por el aviso sobre el problema conocido con las extensiones C. Aunque en realidad no tiene que ver con las conexiones de almacenamiento en caché. La agrupación también es una opción, pero solo si es realmente posible reutilizar las conexiones entre las solicitudes, lo cual todavía no es claro para mí. –

2

Puede instanciar la conexión MongoDB en algún lugar e importarla en lugar de llamar al pymongo.connection.Connection() cada vez que lo necesite. O puede crear un Singleton para hacer esto. Algo como esto en 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 

¿No solucionaría esto su problema?

+1

Como pymongo afirma que es seguro para subprocesos y agrupa la conexión dentro de su clase de conexión, parece que puedo declarar la conexión dentro de la vista, o incluso en el archivo de configuración, y "solo funcionará", incluso cuando acceda por múltiples hilos bajo wsgi. El proyecto de ejemplo de Pymongo parece hacer esto: https://github.com/mdirolf/DjanMon/blob/master/status/views.py –

Cuestiones relacionadas