Wir haben eine leistungsstarke Java (J2SE) Middleware-App, bei der die Latenz von größter Bedeutung ist. Es verwendet einige Stammdaten, die in einer Legacy-Datenbank gespeichert sind, in der eine ältere Anwendung gelegentlich die Daten ändern kann. Aufgrund der Latenzanforderungen planen wir, die stehenden Daten zu cachen, JPA mit Hibernate und vielleicht einen Cache-Provider wie Ehcache zu verwenden.
Wenn jedoch die ständigen Daten aktualisiert werden (durch die Legacy-App), müssen wir so schnell wie möglich darüber informiert werden. Ich dachte über das Setzen eines Ablaufdatums im Cache nach, aber dann wird der Cache nicht aktualisiert, bis die nächste Anforderung für die Daten von der Anwendung durchgeführt wird - zu diesem Zeitpunkt wird die Latenz aufgrund des erneuten Lesens der Datenbank bewirkt.
Idealerweise benötigen wir den Cache, um einen veralteten Wert zurückzugeben, und im Hintergrund wird der Cache in regelmäßigen Abständen mit dem neuesten Wert aus der Datenbank aktualisiert / aktualisiert.
Ist das mit Ehcache möglich? Ich habe SelfPopulatingCache und CacheLoader gesehen, aber das scheint so zu sein, als würde ich viel arbeiten (ich müsste Code für jede Entität schreiben). Hat jemand ein Beispiel für eine CacheLoader-Implementierung? Ich hatte auf eine asynchrone Aktualisierung Option im Abfrage-Cache gehofft.
Gibt es andere Technologien, die eine Lösung bieten könnten? Wir sind nicht an einen JPA-Provider oder Cache-Provider gebunden.
Könnte Spring @Cacheable eine Lösung bieten? Ich habe Spring ehcache cachable erwähnt, selbst-bevölkern-Cache-Bereich, aber seine mir ist nicht klar, was das bedeutet.
Vielen Dank im Voraus.
Welche Datenbank benutzen Sie?
EclipseLink 2.4 wird eine Datenbank-Ereignis-gesteuerte Cache-Invalidierungsfunktion bereitstellen. Dies ist in die Oracle-Datenbank DCN / QCN integriert. Sie können auch etwas mit Triggern verknüpfen.
Sie können auch Oracle GoldenGate, Coherence und TopLink Grid untersuchen.
Wenn Sie die Legacy-Anwendung ändern können, besteht die eine Möglichkeit darin, Cache-Invalidierungsbenachrichtigungen mit etwa ActiveMQ zu senden. Wenn Sie die Legacy-Anwendung nicht ändern können, besteht eine andere Möglichkeit darin, eine indizierte Spalte mit Zeitmarken / Zeilenumdrehungen zu Ihrer Tabelle hinzuzufügen und sie regelmäßig nach Änderungen seit der letzten Abfrage abzufragen.
Ich weiß nicht, wie man das mit EhCache oder einer anderen Komponente macht, aber ein gemeinsamer Ansatz für dieses Problem besteht darin, "zwei Caches zu haben". Lassen Sie mich erklären: Sie haben einen Cache, der Ihre Anwendung mit Daten versorgt (dieser Cache wird während der Anwendung keine Updates erhalten) und ein weiterer Cache wird von einem zeitlich begrenzten Arbeiter mit den neuesten Daten erstellt (Sie können alle x Sekunden oder jedes Mal einen Cache erstellen) Sie erhalten ein Ereignis, das Ihnen mitteilt, dass sich Ihre Daten geändert haben). Wenn Ihr neuer Cache abgeschlossen ist, ersetzen Sie den alten Cache durch den neuen Cache, sodass Ihr kürzlich aktualisierter Cache jetzt eine Anwendung mit 0-Cache-Latenz liefert. Wie Sie sehen, besteht das Problem bei diesem Ansatz darin, dass Ihr Client möglicherweise veraltete Daten sieht, während Ihr neuer Cache nicht vollständig ist. Und natürlich ist es eine sehr teure Methode (Sie werden sehr oft 2 Caches im Speicher haben und auch sehr oft einen neuen Cache erstellen).