2012-04-03 20 views
8

Estoy leyendo acerca de la agrupación de conexiones de SQLAlchemy, que tiene un valor predeterminado de 5 conexiones y se desbordará por defecto a 10.¿Qué sucede cuando se agota un grupo de conexiones?

Si se excede el número de conexiones en caché, ¿qué ocurre? ¿Las solicitudes subsiguientes están en cola hasta que esté disponible una conexión gratuita o se creará una nueva conexión que no ingrese al grupo?

Además, ¿qué sucede con las conexiones no utilizadas cuando el grupo se ha "desbordado" a su valor máximo predeterminado de 10? ¿Las conexiones se desconectan después de la hora predeterminada (como con el grupo estándar), o se lanzan más agresivamente que el grupo estándar?

Respuesta

13

Estás leyendo sobre QueuePool, que gestiona las conexiones de la base de datos para un mejor rendimiento. Lo hace manteniendo abiertas las conexiones inactivas, en caso de que desee reutilizarlas más tarde. La cantidad de conexiones que mantendrá abiertas es pool_size = 5 (valor predeterminado). Si abre una sexta conexión, una de las conexiones en la cola se cerrará, mientras esté inactiva. Si ninguno está inactivo, QueuePool abrirá otros adicionales, hasta max_overflow = 10 (predeterminado). Más y obtendrás un error. Sin embargo, ambos parámetros son configurables. Establezca pool_size = 0 para tener conexiones abiertas ilimitadas. The source is here

+0

pool_size = -1 para ilimitado. – zzzeek

+1

hmm, en el enlace a los documentos, mira QueuePool .__ init__, el docstring dice "' 'pool_size'' se puede establecer en 0 para indicar que no hay límite de tamaño" –

+0

oh tienes razón, estaba mirando pool_recycle – zzzeek

4

por SQLAlchemy docs,

Cuando el número de conexiones con control de salida alcanza el tamaño definido en pool_size, conexiones adicionales serán devueltos hasta este límite. Cuando esas conexiones adicionales se devuelven al grupo, se desconectan y se descartan. Se deduce entonces que el número total de conexiones simultáneas que permitirá el grupo es pool_size + max_overflow, y el número total de conexiones "vacías" que el grupo permitirá es pool_size.

Así que sí, las conexiones desbordadas se liberan más agresivamente que las conexiones que normalmente duermen.

Si realmente se ven en las fuentes de QueuePool._do_get(), verá que plantea una TimeoutError cuando el recuento de conexión es igual al tamaño de la piscina + desbordamiento, y hay conexión se devuelve de nuevo a la piscina poco después connect() se llama.

Cuestiones relacionadas