2013-08-17 13 views
5

Prima di tutto, sto usando Rails 3.2 su Puma (ma con risonanza magnetica), e non sto facendo alcun thread esplicito a mano.ActiveRecord esegue SQL necessario chiudere la connessione? AVVISO DI AVVISO: Le connessioni al database non verranno chiuse automaticamente

io sono in luoghi con il metodo execute, come MyModel.connection.execute o so ActiveRecord::Base.connection.execute può fare la stessa cosa dal momento che tutti i collegamenti siano allo stesso DB per me in questo momento.

di recente ho cominciato a vedere

DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. For example ActiveRecord::Base.connection.close 

Questo sembra auto-esplicativo, ma posso trovare pochissime informazioni su di esso on-line, per lo più sull'utilizzo di ActiveRecord con Sinatra (ex ActiveRecord connection warning. (Database connections will not be closed automatically)).

ho letto questo:

http://blog.daniel-azuma.com/archives/216

che suggerisce che Rack middleware fa per me fino a quando il DB eseguire la transazione è fatto in un controllore (se ho capito bene). Significa che le transazioni eseguite altrove (come un modello o un decoratore - sono utili in molti posti, quindi non voglio metterle direttamente in un unico controller) devono essere esplicitamente chiuse? Anche se si tratta di un metodo di modello che fa, che è stato chiamato da un controllore, ex:

class MyController 
    def show 
    MyModel.do_execute_sql_stuff 
    end 
end 

class MyModel 
    def self.do_execute_sql_stuff 
    connection.execute("WHATEVER;") 
    end 
end 

Devo esplicitamente vicino qui? In tal caso, dovrei usare MyModel.connection.close o MyModel.clear_active_connections! come suggerisce l'articolo? Forse perché l'inglese non è la mia prima lingua, ma quel metodo sembra pericoloso! E come faccio a farlo?

conn = MyModel.connection 
result = conn.execute("STUFF") 
do_stuff_with(result) 
conn.close |or| MyModel.clear_active_connections! 

Così?

Che dire quando si utilizza find_by_sql? Restituirà la connessione al pool o devo farlo esplicitamente?

MODIFICA: Stranamente, la vedo solo nei registri di produzione. Non in fase di sviluppo, né di allestimento (che dovrebbe essere identico alla produzione).

risposta

7

In questo caso È necessario chiudere manualmente la connessione.

Dopo aver eseguito lo script, è possibile chiuderlo manualmente come in questo modo.

after do 
    ActiveRecord::Base.connection.close 
end 
+1

In tal caso? Quando lo fai dal modello? Decoratore? Helper? Questo non è uno script singolo, tuttavia, è in esecuzione in modo continuo ... –

+0

È possibile creare un metodo nel modello e richiamarlo alla fine del codice di esecuzione in cui si desidera chiudere la connessione. Quel metodo ha sopra il codice così ogni volta che viene chiamato, la connessione può essere chiusa. – Mehul

+1

Quello che sto chiedendo è _quando_ devo fare questo - quando eseguo una query dal modello? Da un decoratore? Da un aiutante? Dici "e chiamalo alla fine del tuo codice di esecuzione" - quale codice di esecuzione è? –

Problemi correlati