2012-04-24 6 views
5

Tengo una entidad (Autor) y una acción de controlador que representa a todos los autores.Comportamiento de GORM extraño en grises al actualizar la página (F5)

def index = { 
    def list = Author.list() 
    render(view: 'index', model: ['allauthors' : list]) 
} 

Al renderizar la página, se ejecuta una sola consulta como se esperaba:

Hibernate: 
    select 
    this_.id as id0_0_, 
    this_.version as version0_0_, 
    this_.name as name0_0_ 
    from 
    author this_ 

Sin embargo, cuando pulso Actualizar (F5) a continuación, una instrucción de selección se ejecuta para cada autor (en este caso tengo 3 autores):

Hibernate: 
select 
    author0_.id as id0_0_, 
    author0_.version as version0_0_, 
    author0_.name as name0_0_ 
from 
    author author0_ 
where 
    author0_.id=? 
Hibernate: 
select 
    author0_.id as id0_0_, 
    author0_.version as version0_0_, 
    author0_.name as name0_0_ 
from 
    author author0_ 
where 
    author0_.id=? 
Hibernate: 
select 
    author0_.id as id0_0_, 
    author0_.version as version0_0_, 
    author0_.name as name0_0_ 
from 
    author author0_ 
where 
    author0_.id=? 

¿Por qué esto sucede ???

+0

Podría ser debido a que su segundo caché de nivel está desactivada por defecto. Si prevé que la función de actualización suceda mucho, puede almacenar en caché la consulta de lista pasando el parámetro de caché en la llamada a la lista(). –

+0

lo curioso es por qué la sentencia: Author.book() ejecuta la instrucción de selección única normal por primera vez, pero al actualizarla ejecuta múltiples instrucciones de selección para cada autor. ¿Algunas ideas? – geo

+0

Agregué la etiqueta de hibernación porque creo que esto se podría explicar mejor en el nivel de hibernación y no en el nivel de Grails. –

Respuesta

1

Parece que esto tiene que ver con el caché de consultas. Si usted tiene

cache.use_query_cache = true 

en su Datasource.groovy pero no tienen Cacheing configurado en su clase de dominio de la caché parece estar desalojar a todas las entradas en cada list() y tener que volver a caché de cada uno (sólo una adivinar).

Si agrega Cacheing a su dominio las múltiples selecciona desaparecen - de hecho, no selecciona se realizan cuando restauro después de añadir esto:

static mapping = { 
    cache true 
} 
Cuestiones relacionadas