2012-07-16 13 views
5

Ho una chiamata db = pymongo.Connection() in views.py di Django per una semplice connessione MongoDB per memorizzare alcune statistiche semplici.best practice di pooling Pyjongo + django?

Qual è la prassi migliore per rendere il supporto auto MongoDB pool di connessioni?

Dove ho bisogno di mettere il codice end_request()?

Come scelgo il parametro max_pool_size durante la connessione?

risposta

7

How does connection pooling work in PyMongo?

Ogni istanza di collegamento è dotato di pool di connessioni. Per impostazione predefinita, ogni thread riceve il proprio socket riservato alla prima operazione. I socket vengono trattenuti fino a quando end_request() viene chiamato da quel thread.

Calling end_request() consente la presa da restituire al pool, e per essere utilizzato da altri thread invece di creare un nuovo socket. uso giudizioso di questo metodo è importante per applicazioni con molti fili o con fili esecuzione prolungata che rendono poche chiamate a PyMongo operazioni.

In alternativa, una connessione creata con auto_start_request = False sarà condivide socket (in modo sicuro) tra tutti i thread.

penso che si riduce al tipo di applicazione che hai e da quanto tempo le richieste saranno tenere su una connessione. L'idea di chiamare end_request è di ausilio per le richieste a lungo termine che si aggrappano a un socket per un lungo periodo e causano la creazione di molti socket. Se una singola richiesta può rilasciare la connessione quando non ne ha più bisogno, il socket può essere riproposto per altre richieste.

Se sono richieste veloci, quindi credo che la auto_start_request=False opere riutilizzando la presa.

garantire una connessione continua con lo stesso mezzo di corrente che sia coerente avrà letture. Pensa se hai fatto una query ma è stata ritardata, quindi hai fatto immediatamente un'altra query e ha utilizzato un socket diverso. Questo socket riesce a rispondere prima del precedente. Avresti dati incoerenti dal momento che non riflette la scrittura precedente.

+0

Ciao @jdi, grazie per la risposta, puoi condividere il tuo suggerimento con il parametro 'max_pool_size'? – est

+1

È un modo per gestire il numero di connessioni consentite da una singola connessione. Se la tua app è a thread singolo, consumerà sempre solo 1 nel pool. Se si tratta di un'app pesante, ce ne sarà una per thread e si potrebbe desiderare di limitare il numero di autorizzazioni consentite su un server – jdi

+1

In PyMongo 3, l'opzione "auto_start_request" è scomparsa. – Mithril