classe di Django cursor
è solo un involucro intorno al sottostante DB cursor
, quindi l'effetto di lasciare la cursor
aperto è sostanzialmente legata al driver DB sottostante.
Secondo il psycopg2 (psycopg2 è DB conducente Django utilizza per PostgreSQL DB) FAQ, i cursori sono leggeri, ma nella cache i dati che vengono restituiti dalle query eseguite utilizzando l'oggetto del cursore, che potrebbe potenzialmente sprecare memoria:
I cursori sono oggetti leggeri e la creazione di molti di essi non dovrebbe rappresentare alcun tipo di problema. Ma si noti che i cursori utilizzati per recuperare i risultati set memorizzeranno i dati nella cache e utilizzeranno la memoria in proporzione alla dimensione impostata del risultato . Il nostro suggerimento è quasi sempre creare un nuovo cursore e smaltire quelli vecchi non appena i dati non sono più necessari (chiamare close() su di loro.) L'unica eccezione sono i loop stretti in cui uno di solito lo utilizza lo stesso cursore per un intero mazzo di INSERT o UPDATE.
Django utilizza MySQLdb
come backend per MySQL, che ha diversi tipi di cursori, tra cui alcuni che effettivamente conservano le loro risultato-set sul lato server. Il MySQLdb
documentation for Cursor.close
fanno un punto da notare che è molto importante chiudere il quando hai finito con loro cursore sul lato server:
Se si utilizza cursori sul lato server, è molto importante per chiudere il cursore quando hai finito con esso e prima di crearne uno nuovo.
Tuttavia, questo non è rilevante per Django, perché utilizza la classe predefinita Cursor
fornito da MySQLdb
, che memorizza i risultati sul lato client. Lasciare aperto un cursore usato rischia di sprecare la memoria utilizzata dal set di risultati memorizzato, proprio come psycopg2
.La close
method sul cursore elimina solo il riferimento interno per la connessione db ed esaurisce il set di risultati memorizzati:
def close(self):
"""Close the cursor. No further queries will be possible."""
if not self.connection: return
while self.nextset(): pass
self.connection = None
Come meglio posso dire di guardare alla fonte, tutti i restanti backend utilizzati da Django (cx_oracle, sqlite3/pysqlite2) tutti seguono lo stesso schema; memoria libera eliminando/reimpostando i risultati memorizzati/riferimenti oggetto. Il sqlite3 docs non menziona nemmeno che la classe Cursor
ha un metodo di chiusura ed è usata solo sporadicamente nel codice di esempio incluso.
Sei giusto che una cursor
saranno chiuse quando __del__()
si chiama sull'oggetto cursor
, quindi la necessità di chiudere in modo esplicito è solo un problema se si sta tenendo un riferimento longevo al cursor
; per esempio. un oggetto self.cursor
che stai mantenendo come metodo di istanza di una classe.
Credo che sia molto simile a questa domanda http://stackoverflow.com/questions/5669878/python-mysqldb-when-to-close-cursors ?? –
@AamirAdnan grazie, non proprio - visto prima di postare. So come chiudere il cursore. La domanda riguarda quanto sia grave non chiuderla e quali sono le conseguenze. – alecxe