2012-04-03 3 views
8

sto leggendo su pool di connessioni di SQLAlchemy, che ha un valore predefinito di 5 connessioni e sarà da troppo pieno di default a 10.Cosa succede quando un pool di connessioni è esaurito?

Se viene superato il numero di connessioni nella cache, cosa succede? Le richieste successive vengono messe in coda fino a quando non viene resa disponibile una connessione gratuita o viene creata una nuova connessione che non entra nel pool?

Inoltre, cosa succede alle connessioni inutilizzate quando il pool ha "overflow" al suo valore predefinito massimo di 10? Queste connessioni si disconnettono dopo il tempo predefinito (come nel pool standard) o vengono rilasciate in modo più aggressivo rispetto al pool standard?

risposta

13

Stai leggendo il QueuePool, che gestisce le connessioni al database per prestazioni migliori. Lo fa tenendo aperte le connessioni inattive, nel caso in cui si voglia riutilizzarle in seguito. Il numero di connessioni che manterrà aperto è pool_size = 5 (predefinito). Se si apre una sesta connessione, una delle connessioni nella coda verrà chiusa, a condizione che sia inattiva. Se nessuno è inattivo, il QueuePool ne aprirà altri, fino a max_overflow = 10 (predefinito). Più e avrai un errore. Tuttavia entrambi questi parametri sono configurabili. Imposta pool_size = 0 per avere connessioni aperte illimitate. The source is here

+0

pool_size = -1 per illimitato. – zzzeek

+1

hmm, nel link ai documenti, guarda QueuePool .__ init__, la docstring dice "' 'pool_size'' può essere impostato a 0 per indicare nessun limite di dimensione" –

+0

oh hai ragione stavo guardando pool_recycle – zzzeek

4

Per SQLAlchemy docs,

Quando il numero di connessioni controllato-out raggiunge alle dimensioni impostate pool_size, ulteriori connessioni saranno restituiti fino a questo limite. Quando queste connessioni aggiuntive vengono restituite al pool, vengono disconnesse e scartate. Segue quindi che il numero totale di connessioni simultanee consentite dal pool è pool_size + max_overflow e il numero totale di connessioni "in sospeso" consentite dal pool è pool_size.

Quindi sì, le connessioni in overflow vengono liberate in modo più aggressivo rispetto alle connessioni normalmente dormite.

Se effettivamente guardano le fonti di QueuePool._do_get(), vedrete che essa solleva una TimeoutError quando il conteggio di connessione è pari dimensioni della piscina + troppo pieno, e nessuna connessione è restituito di nuovo al pool subito dopo connect() si chiama.