2013-02-14 24 views
10

Abbiamo un'applicazione Python con oltre venti moduli, la maggior parte dei quali sono condivisi da diverse applicazioni web e console.Come devo stabilire e gestire le connessioni del database in un'app Python multi-modulo?

Non ho mai avuto una chiara comprensione delle migliori pratiche per stabilire e gestire la connessione al database in app Python multi modulo. Considerare questo esempio:

Ho un modulo che definisce una classe di oggetti per gli utenti. Ha molti difetti per la creazione/eliminazione/aggiornamento degli utenti nel database. Il modulo users.py viene importato in a) un'utilità basata su console, 2) un'applicazione web basata su web.py e 3) un processo daemon in esecuzione costante.

Ognuna di queste tre applicazioni ha diversi cicli di vita. Il demone può aprire una connessione e tenerla aperta. L'utilità della console si connette, funziona, quindi muore. Ovviamente le richieste http sono atomiche, tuttavia il web server è un demone.

Attualmente sto aprendo, utilizzando poi la chiusura di una connessione all'interno di ogni funzione nella classe Utenti. Questo sembra il più inefficiente, ma funziona in tutti gli esempi. Un'alternativa utilizzata come test è dichiarare e aprire una connessione globale per l'intero modulo. Un'altra opzione sarebbe quella di creare la connessione al livello superiore dell'applicazione e passare i riferimenti durante l'istanziazione delle classi, ma questa mi sembra l'idea peggiore.

So che ogni architettura dell'applicazione è diversa. Mi sto solo chiedendo se esiste una buona pratica e quale sarebbe?

+0

Guarda il pool di connessioni come per questa [domanda] (http://stackoverflow.com/questions/98687/what-is-the-best-solution-for-database-connection-pooling-in-python) – Mark

risposta

9

Il metodo migliore è quello di aprire una connessione quando è necessario eseguire alcune operazioni (come ottenere e/o aggiornare i dati); manipolare i dati; scriverlo al database in una query (molto importante per le prestazioni), quindi chiudere la connessione. L'apertura di una connessione è un processo abbastanza leggero.

Alcune insidie ​​per le prestazioni includono

  • l'apertura del database quando non sarà sicuramente interagire con esso
  • utilizzando i selettori che prendono più dati del necessario (ad esempio, il recupero dei dati su tutti gli utenti e filtrandola in Python, invece di chiedere a MySQL di filtrare i dati inutili)
  • valori di scrittura che non sono stati modificati (ad esempio, l'aggiornamento di tutti i valori di un profilo utente, quando è stata modificata la loro e-mail)
  • con ciascun campo aggiornare il server individualmente (e .es., aprire il db, aggiornare l'e-mail dell'utente, chiudere il db, aprire il db, aggiornare la password utente, chiudere il db, aperto d ... si ottiene l'idea)

La linea di fondo è che non importa quante volte si apre il database, è il numero di query che si esegue. Se riesci a ottenere il tuo codice per partecipare a query correlate, hai vinto la battaglia.

+0

è quello che stavo cercando, conferma la mia ipotesi migliore e significa che non devo rielaborare nulla! Grazie per i suggerimenti extra - Sto già facendo tutto questo ma era una bella lista di controllo. – hikaru

4

Le connessioni MySQL sono relativamente veloci, quindi questo potrebbe non essere un problema (ad esempio, dovresti misurare). La maggior parte degli altri database richiede molte più risorse per creare una connessione.

Creare una nuova connessione quando ne avete bisogno è sempre la più sicura ed è una buona prima scelta. Alcune librerie db, ad es. SqlAlchemy, dispone di pool di connessione incorporati che riutilizzeranno correttamente le connessioni per te.

Se si decide di mantenere viva una connessione in modo da poter riutilizzare, ci sono alcuni punti da tenere presente:

  1. connessioni che vengono utilizzati solo per la lettura sono più facili da riutilizzo delle connessioni utilizzate per modificare i dati del database.

  2. Quando si avvia una transazione su una connessione, fare attenzione che nient'altro possa utilizzare quella connessione per qualcos'altro mentre lo si sta utilizzando.

  3. I collegamenti che rimangono seduti per molto tempo diventano stantii e possono essere chiusi da sotto di te, quindi se stai riutilizzando una connessione dovrai verificare se è ancora "vivo", ad es. inviando "seleziona 1" e verificando che si ottiene un risultato.

Personalmente raccomando di non implementare il proprio algoritmo di pooling di connessione. È davvero difficile eseguire il debug quando le cose vanno male. Scegli invece una libreria di database che lo faccia per te.

Problemi correlati