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).
In tal caso? Quando lo fai dal modello? Decoratore? Helper? Questo non è uno script singolo, tuttavia, è in esecuzione in modo continuo ... –
È 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
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 è? –