2016-04-06 5 views
1

Wir haben einen Springboot-Webservice (mit Federdaten, Ruhezustand), der durch Lesen einer ganzen Tabelle aus der Datenbank eine riesige Datei generiert und zurückgibt. Es braucht viel Zeit, um dies zu tun, was viel mehr ist als die vom Client festgelegte Zeit. Also habe ich beschlossen, ehcache zu verwenden, um die Daten der gesamten Tabelle zwischenzuspeichern und die Datei daraus zu generieren (ich weiß, dass der Cache dafür nicht gedacht ist, aber ich habe keine andere Idee). Es funktioniert zufriedenstellend. Das Problem tritt jedoch auf, wenn Updates für die Daten erforderlich sind. Die Aktualisierungen werden auf einer Ebene pro Datensatz ausgeführt, der Cache wird jedoch auf der gesamten Tabellenebene gespeichert. Ich bin nicht sicher, wie man ehcache in die Aufzeichnungen innerhalb des zwischengespeicherten Gegenstandes schaut und sie ändert (ich möchte nicht jede Reihe wegen einiger Leistungsgründe als getrenntes Zwischenspeicherobjekt speichern). Jede Hilfe wird sehr geschätzt.Zwischenspeichern der gesamten Tabelle

Gerade jetzt, um dies zu verwalten, habe ich Ehcache los und eine Hash-Karte verwenden. Dies führte zu einer Menge Kesselplatte Code, den ich nicht mag.

EDIT: Gibt es eine Möglichkeit, auf Ehcache Eviction Mechanismus Haken und manuell das Cache-Objekt ändern?

+1

Wie haben Sie Caching angewendet, verwenden Sie Spring Cache oder haben Sie die 2. Ebene Cache-Option von Hibernate verwendet. –

Antwort

0

Mit dem Parameter timeToLiveSeconds in ehcache.xml können Sie angeben, wieviel Zeit die Daten im Cache haben würden. Eine Option besteht darin, eine Zeit anzugeben (z. B. 24 Stunden), sodass die Daten für diese Zeit im Cache gespeichert werden und beim nächsten Methodenaufruf aktualisiert werden.

Um zu vermeiden, dass der Client diesen Aufruf ausführt (wegen der aufgewendeten Zeit), können Sie eine geplante Spring-Task so einrichten, dass sie denselben Zeitraum aufruft, sodass der Cache regelmäßig aktualisiert wird.

Eine andere Möglichkeit besteht darin, den Cache zu aktualisieren, wenn Sie Änderungen vornehmen, indem Sie eine spezielle Funktion aufrufen. Sie können den Cache also entfernen und dann die Methode erneut aufrufen, um die Daten im Cache neu aufzuladen. In diesem Link wird erklärt, wie Sie einen Cache entfernen, um die Aktualisierung zu erzwingen: http://forum.spring.io/forum/spring-projects/data/55466-how-to-force-ehcache-to-refresh

+0

Ich denke, ich war nicht klar über die Zeit Teil. Ich kann es mir nicht leisten, die gesamten Daten alle 5 Minuten oder so nachzuladen. Die Datei muss alle fünf Minuten generiert werden und die Daten müssen aktuell sein. – falcon

+0

Ich denke ich verstehe dein Problem nicht gut. Wie gesagt, der Cache wird erst nach der angegebenen Zeit neu geladen (z. B. 24 Stunden), oder manuell, wenn Sie Daten aktualisieren. Offensichtlich, wenn Daten alle 5 Minuten in der Datenbank aktualisiert werden, ist dies keine gültige Lösung mehr – Wakachopo