2010-04-29 6 views
5

Sto cercando di capire da dove viene generata tutta una serie di query aggiuntive dalla mia app per rails. Ho bisogno di alcune idee su come affrontarlo. Oppure, se qualcuno può darmi qualche suggerimento, ti sarei grato.Come posso capire dove vengono generati tutti questi extra sqlite3 nella mia app per rails?

ottengo questi:

SQL (1.0ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 

    SQL (0.8ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 

    SQL (0.8ms) SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 

ripetuto più e più volte su ogni richiesta al DB (fino a 70 volte per una singola richiesta)

Ho provato a installare un plugin che risalire l'origine di le domande, ma in realtà non ha aiutato affatto. Sto usando la gemma di hobofields, non so se questo è ciò che sta facendo, ma sono un po 'sposato al momento

Qualche consiglio su come cercare la fonte di queste domande extra?

+0

Sei in modalità sviluppo? Probabilmente Rails sta ricaricando le informazioni sulle tabelle in fase di sviluppo. – Voyta

+0

Sto vedendo esattamente la stessa cosa di te. Si verifica solo per me quando si utilizza sqlite (non mysql). E * * * mostra queste query nel registro quando c'è un errore dell'applicazione che viene salvato. –

+0

Sì, ero in modalità sviluppo e non ho visto questi dati registrati, ma non è questo il punto. È davvero difficile leggere il registro quando lo schermo si riempie di rifiuti inutili. È anche preoccupante: c'è qualche impatto sulla produzione? È il risultato di una cattiva programmazione che queste chiamate di database aggiuntive stanno accadendo? – radixhound

risposta

3

Dai un'occhiata alla ActiveRecord gioiello nel connection_adapters/sqlite_adapter.rb on line 173 (sto usando ActiveRecord 3.0.7) si dispone di una funzione chiamata tabelle che genera la query esatto avete inviato:

SELECT name FROM sqlite_master WHERE type = 'table' AND NOT name = 'sqlite_sequence'

In modalità sviluppo questa funzione viene chiamata per ogni tabella dal database, ad ogni richiesta. In produzione, questa funzione viene chiamata una sola volta, all'avvio del server e il risultato viene memorizzato nella cache.


In sviluppo per ogni richiesta rotaie appare nel database per vedere quali colonne ogni tabella è quindi in grado di generare metodi sui vostri modelli come "find_by_name". Dal momento che nella produzione è improbabile che il database cambi, le rotaie eseguono questa ricerca solo all'avvio del server.

+0

Fantastico, grazie! Ora ho solo bisogno di capire come impedire che queste query vengano visualizzate nel registro poiché rende il debugging doloroso - ma almeno ora ho un'idea migliore su come scovarlo quando la incontrerò la prossima volta. Non è più qualcosa sul mio radar però. – radixhound

0

È molto difficile dirlo senza guardare nel codice.

ma sono sicuro che si scrive la query in un certo ciclo

for i in 0..70 
    SqliteMaster.find(:all, :conditions=>["type=? and not name=?", 'table', 'sqlite_sequesnce']) 
end 

Quindi il mio consiglio è quello di controllare tutti i metodi che viene chiamato dopo aver richiesto certo metodo e guardare se la query chiamato in un ciclo.

+1

No: non sta succedendo nel codice da nessuna parte. È tutto roba sotto i baffi (rotaie magiche). [Questo] (http://stackoverflow.com/questions/3532814/how-do-i-turn-off-the-sqlite3-sqlite-master-logging-in-rails) sembra andare nella giusta direzione.Preferirei capire _perché_ ci sono così tante chiamate ridondanti. – radixhound

0

Ho appena visto questo apparire nei miei log quando eseguo una ricerca con la gemma metasearch ma SOLO in modalità sviluppo.

0

Credo che sia causato dal plugin acts-as-taggable-on.

Verificherà se la tabella o la colonna della cache esiste.

Problemi correlati