2017-10-23 2 views
0

Ich begann mit der Arbeit an einem Grails-Projekt, das Spring und Hibernate verwendet. Das Problem entsteht, wenn ich einen Eintrag in der Datenbank ändern, mit dem Code folgendenGrails-Controller aktualisiert Cache bei Änderung der Datenbank nicht

class AlarmsController implements UserAware { 
    def saveAlarm() { 
     def user = DeviceUser.findById(id) 
     user.field = value 
     user.save(failOnError: true, flush: true) 

     render serialize(user) as JSON <%-- not relevant --%> 
    } 
} 

wo field, id und value sind einige Variablen, die ich nicht vorhanden und sind nicht wichtig. Das Ding wird in der Datenbanktabelle DeviceUser gespeichert, die ich überprüfen kann, indem ich mich manuell mit der Datenbank verbinde und eine SELECT-Anweisung ausführe. Nun stellt sich das Problem, dass, wenn ich localhost:8080/api/devices/1234 zuzugreifen, die sich auf ein Verfahren abgebildet wird show(id):

class DeviceUserController implements UserAware { 
    def show(id) { 
     def deviceUser = DeviceUser.where({ 
      id = id, 
      device = device 
     }).get() 

     render serialize(deviceUser) as JSON 
    } 
} 

das Ergebnis nicht aktualisiert bekommt (auch nach harten Refresh ausgeführt wird, das heißt CTRL + F5). Ich gehe davon aus, dass der Inhalt zwischengespeichert wird, was in der Tat ist, aber während ich das Problem google, sollte flush: true verhindern, dass der zwischengespeicherte Inhalt beim nächsten Aufruf abgerufen wird.

serialize(content) ist eine Klassenmethode, die content in JSON-Map konvertiert.


Ich habe verschiedene Dinge ausprobiert, wie evict(DeviceUser), aber nichts funktionierte. Ich habe versucht, auch nach dem Neustart des Computers user.field zu 0 Einstellung (auf localhost:8080/api/devices/1234user.field wird immer so vorgestellt 1 eingestellt werden), aber es hat immer noch nicht ändern (der Wert war noch 1, obwohl in der Datenbank es 0 war).

+0

Ich würde vermuten, wo die Abfrage das Problem ist. Versuchen Sie 'id == idParam && device == deviceParam' – andi

+0

@andi es stellte sich heraus, dass die' findById' das Problem war. Irgendwie hielten diese Leute, die an einem Projekt arbeiteten, es für ok, ein Feld namens "device_id" zu haben, das nicht einzigartig ist. Was passierte, war, dass wenn ich in die Datenbank schrieb, es auf dem ersten Objekt in der Datenbank gespeichert wurde, das es gefunden hat, dasjenige mit der höchsten 'ID' (nicht 'device_id' !!). Aber wenn ich '.get()' ausführte, gab es ein anderes Objekt zurück, das die gleiche 'device_id' hatte. Also musste ich 'findById' expliziter machen, z. 'findByIdAndUser'. Und ich habe 2 Tage damit verbracht, das Problem zu lösen, wo es keine Fehler gab – campovski

Antwort

0

Die Frage wurde gelöst. Zeige Kommentare. Das Problem lag nicht im Cache, sondern in einem seltsamen Datenbanklayout, das nach dem Drucken ganzer Tabellen aus der Datenbank erfolgreich debuggt wurde.

Verwandte Themen