2012-04-24 5 views
5

Ich habe eine Entität (Autor) und eine Controller-Aktion, die alle Autoren rendert.Weird GORM Verhalten in Grails beim Aktualisieren der Seite (F5)

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

Wenn die Seite dargestellt wird, wird eine einzelne Abfrage ausgeführt, wie erwartet:

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

Wenn jedoch i drücken Aktualisieren (F5) dann eine select-Anweisung wird für jeden Autor ausgeführt (hier ich habe 3 Autoren):

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=? 

Warum das passiert ???

+0

Es könnte sein, weil Ihr Second-Level-Caching standardmäßig ausgeschaltet ist. Wenn Sie davon ausgehen, dass die Aktualisierungsfunktion häufig ausgeführt wird, können Sie die Listenabfrage zwischenspeichern, indem Sie den Cache-Parameter im Aufruf von list() übergeben. –

+0

die seltsame Sache ist, warum die Anweisung: Author.book() die normale Single-Select-Anweisung zum ersten Mal ausführen, aber bei der Aktualisierung führt mehrere Select-Anweisungen für jeden Autor! Irgendwelche Ideen? – geo

+0

Ich habe das Hibernate-Tag hinzugefügt, weil ich denke, dass dies besser im Ruhezustand und nicht im Grails-Level erklärt werden kann. –

Antwort

1

Es sieht so aus, als ob dies mit dem Abfrage-Cache zu tun hat. Wenn Sie

cache.use_query_cache = true 

in Ihrem Datasource.groovy aber nicht Cachen in Ihrem Domain-Klasse eingerichtet haben der Cache alle Einträge zu sein scheint auf jedem list() evicting und das Produkt erneut Cache jeder (nur vermuten).

Wenn Sie Cachen von Ihrer Domain die mehreren wählt hinzufügen gehen weg - in der Tat NO wählt getan werden, wenn ich nach dem Hinzufügen dieses aufzufrischen:

static mapping = { 
    cache true 
}