2010-04-29 12 views
5

Estoy tratando de averiguar en qué parte de mi aplicación de rieles está generando un montón de consultas adicionales. Necesito algunas ideas sobre cómo abordarlo. O, si alguien puede darme algunas pistas, estaría agradecido.¿Cómo puedo saber dónde se están generando todos estos sqlite3 adicionales en mi aplicación Rails?

consigo los siguientes:

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' 

repite una y otra en cada petición a la DB (tanto como 70 veces para una sola petición)

I intentado instalar un plugin que trazó la fuente de las consultas, pero realmente no ayudó en absoluto. Estoy usando la gema hobofields, no sé si eso es lo que está haciendo, pero de alguna manera estoy casado con ella en este momento

¿Algún consejo sobre cómo buscar el origen de estas consultas adicionales?

+0

¿Estás en modo de desarrollo? Probablemente Rails está recargando información sobre tablas en desarrollo. – Voyta

+0

Estoy viendo exactamente lo mismo que tú. Solo me ocurre cuando uso sqlite (no mysql). Y * solo * muestra estas consultas en el registro cuando hay un error de aplicación que se rescata. –

+0

Sí, estaba en modo de desarrollo y no vi esta producción registrada, pero ese no es realmente el punto. Es realmente difícil leer el registro cuando la pantalla se llena de basura sin sentido. También es preocupante: ¿hay algún impacto en la producción? ¿Es el resultado de una codificación deficiente que están ocurriendo estas llamadas extra a la base de datos? – radixhound

Respuesta

3

Tenga una mirada en ActiveRecord joya en connection_adapters/sqlite_adapter.rb en la línea 173 (estoy usando ActiveRecord 3.0.7) que tiene una función llamada tablas que genera la consulta exacta informados:

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

En modo de desarrollo, se llama a esta función para cada tabla desde su base de datos, en cada solicitud. En producción, esta función se llama solo una vez, cuando se inicia el servidor y el resultado se almacena en caché.


En el desarrollo de cada solicitud rieles mira en su base de datos para ver qué columnas de cada tabla por lo que se puede generar métodos en sus modelos como "find_by_name". Como en la producción es poco probable que su base de datos cambie, Rails realiza esta búsqueda solo al inicio del servidor.

+0

¡Increíble, gracias! Ahora solo tendré que averiguar cómo evitar que estas consultas aparezcan en el registro, ya que hace que la depuración sea dolorosa, pero al menos ahora tengo una mejor idea de cómo buscarla la próxima vez que la encuentre. Aunque ya no es algo en mi radar. – radixhound

0

Es muy difícil decir esto sin mirar el Código.

pero estoy seguro de que usted escriba su consulta en un determinado bucle

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

Así que mi consejo es que para comprobar todos los métodos que se llama a después de solicitar cierto método y mirar si la consulta se llama en un bucle.

+1

No, eso no está sucediendo en el código en ninguna parte. Es todo bajo el capó (magia de rieles) cosas. [Este] (http://stackoverflow.com/questions/3532814/how-do-i-turn-off-the-sqlite3-sqlite-master-logging-in-rails) parece dirigirse en la dirección correcta.Sin embargo, preferiría entender _por qué_ hay tantas llamadas redundantes. – radixhound

0

Acabo de ver esto apareciendo en mis registros cuando realizo una búsqueda con la gema de metabuscado, SÓLO en el modo de desarrollo.

0

Creo que es causado por el complemento acts-as-taggable-on.

Comprobará si existe la tabla o la columna de caché.

Cuestiones relacionadas