2011-12-27 81 views
21

Este es un ejemplo de código que me gustaría correr:¿Cómo cerrar la conexión sqlalchemy en MySQL

for i in range(1,2000): 
    db = create_engine('mysql://[email protected]/test_database') 
    conn = db.connect() 
    #some simple data operations 
    conn.close() 
    db.dispose() 

¿Hay una manera de ejecutar este sin conseguir "Demasiadas conexiones" errores de MySQL? Ya sé que puedo manejar la conexión de lo contrario o tengo un grupo de conexiones. Simplemente me gustaría saber cómo cerrar correctamente una conexión desde sqlalchemy. ¡Gracias de antemano!

+1

IMO: que cubre las dos opciones: la puesta en común o fuera del bucle. – xQbert

+2

Parece su ejemplo ya. no "Demasiadas conexiones" aquí (ya que la conexión se abre/cierra dentro del ciclo) –

+0

@martincho incluso No puedo generar el error "Demasiadas conexiones" desde su código :(. – Nilesh

Respuesta

39

Aquí es cómo escribir ese código correctamente:

db = create_engine('mysql://[email protected]/test_database') 
for i in range(1,2000): 
    conn = db.connect() 
    #some simple data operations 
    conn.close() 
db.dispose() 

Es decir, el Engine es una fábrica para las conexiones, así como una piscina de conexiones, no la propia conexión. Cuando dice conn.close(), la conexión es devuelta al grupo de conexiones dentro del motor, no realmente cerrada.

Si desea que la conexión sea realmente cerrada, es decir, no se reúnen, se deshabilita la agrupación a través de NullPool:

from sqlalchemy.pool import NullPool 
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool) 

Con la configuración anterior Engine, cada llamada a conn.close() cerrará la conexión DBAPI subyacente.

Si otoh que realmente desea conectarse diferentes bases de datos en cada llamada, es decir, su hardcoded "localhost/test_database" es solo un ejemplo y que en realidad tienen un montón de diferentes bases de datos, entonces el enfoque utilizando dispose() está bien; cerrará todas las conexiones que no estén desprotegidas del grupo.

En todos los casos anteriores, lo importante es que el objeto Connection se cierra a través de close(). Si está utilizando cualquier tipo de ejecución "sin conexión", es decir, engine.execute() o statement.execute(), el objeto ResultProxy devuelto por esa llamada de ejecución debe leerse completamente o cerrarse explícitamente de otra manera a través del close(). Un Connection o ResultProxy que aún está abierto prohibirá los enfoques NullPool o dispose() desde el cierre de cada conexión.

+0

'dispose()' !! Lo necesitaba para cerrar una sesión, ya que 'session.close()' no era suficiente. Recomiendo agregar esto en la documentación de SQLAlchemy, según mi experiencia, no está claro cómo cerrar una sesión correctamente. – fedorqui

+0

llama close(), as documentado. dispose() no es necesario y, de hecho, llamar a disponer() virtualmente nunca es necesario para el uso normal de SQLAlchemy. No dude en enviar un correo electrónico a la [lista de correo] (http://groups.google.com/group/sqlalchemy) con información sobre su problema específico, tal vez haya ejecutado algunas directivas especiales, como "SET" en su sesión, que no se borran cuando se utiliza la agrupación (hay una manera diferente de manejar eso). – zzzeek

+0

Acabo de publicar la información en una nueva pregunta: [¿Cómo puedo cerrar correctamente una sesión de SQLAlchemy?] (Http://stackoverflow.com/questions/21738944/how-can-i-properly-close-a-sqlalchemy-session) Si está bien que responda aquí. De lo contrario, me pondré en contacto a través de la lista de correo. ¡Muchas gracias! – fedorqui

4

Trató de encontrar una solución para desconectarse de la base de datos por un problema no relacionado (debe desconectarse antes de bifurcar).

Necesita invalidate la conexión desde la piscina de conexión también.

En su ejemplo:

for i in range(1,2000): 
    db = create_engine('mysql://[email protected]/test_database') 
    conn = db.connect() 
    # some simple data operations 
    # session.close() if needed 
    conn.invalidate() 
    db.dispose() 
Cuestiones relacionadas