2016-07-07 8 views
2

Ich habe eine Pause-API, die einen Datensatz in eine Datenbank mit einer ID say entityId einfügt. Ich habe eine HashMap, die die EntityId und das Entitätsobjekt speichert und hier als Cache fungiert.Zugriff auf HashMap, das als Cache verwendet wird

Kurz nach dem Einfügen der Entität und Aktualisieren des Cache (HashMap), wenn ich nachschlagen, ist es manchmal nicht in der Lage, die ID aus dem Cache zu finden.

Hinweis: - ich den Rest api in einer Schleife laufen lasse und eine Lasttest zu tun, das Objekt zu überprüfen ist immer vorhanden in dem Cache

Jede Hilfe in dieser Hinsicht sehr geschätzt. Was kann der Grund sein, dass es nicht möglich ist, die ID aus dem Cache zu finden.

+1

Bitte Postleitzahl – Chinni

+0

ist es ConcurrentHashMap? Was ist der Umfang der Klasse? Machst du nach dem Aktualisieren des Cache Logging? Wenn ja, kannst du die ID sehen? – HRgiger

+0

Ja, wenn ich eine Protokollierung mache, sehe ich, dass die neuesten Werte in der Karte vorhanden sind. Aber ich versuche, den Wert mithilfe der Methode ma.getValues ​​() abzurufen, die der neu hinzugefügte Wert nicht reflektiert. – VKR

Antwort

0

Es hängt davon ab, wie der Belastungstest ausgeführt wird, und vom Zeitintervall zwischen nachfolgenden Schreib- und Leseanforderungen.

Obwohl wichtiger ist, ist die Art, wie Ihre Cache/Hashmap aktualisiert wird.

Are you updating the HashMap BEFORE inserting into the Database 


Are you updating the HashMap AFTER inserting into the Database. 

Wenn Ihr den Einsatz zu tun, nachdem sie in die Datenbank zu schreiben, dann wird es möglicherweise eine Verzögerung, bevor der HashMap aktualisiert wird, was bedeutet, dass, wenn die nachfolgende Anforderung für das Lesen in der HashMap kommt nicht so aktualisiert worden noch.

Es könnte sich lohnen, ein Protokoll an dem Punkt hinzuzufügen, an dem die Anfrage dem HM hinzugefügt wird, und ein Protokoll für die Zeit, zu der die Leseanfrage kommt. Das könnte Ihnen eine Vorstellung davon geben, ob die HashMap wirklich existiert aktualisiert oder nicht.

+0

Warum gibt es eine Verzögerung, wenn die HashMap nach dem Einfügen in die Datenbank aktualisiert wird? – VKR

+0

Es hängt davon ab, wie lange es dauert, einen Datensatz in die Datenbank einzufügen und wie Ihre Verbindungen zur Datenbank eingerichtet wurden. Aber wenn Sie das Update auf die HashMap nach der Datenbankeinfügung vornehmen, kann es einige hundert Millisekunden dauern, bevor die HashMap aktualisiert wird. Und da Sie erwähnt haben, dass Sie dies in einer Schleife tun, könnte es möglicherweise bedeuten, dass Ihre REST-API für das Lesen bereits vor diesem Update ausgelöst wird. Wiederum sage ich nicht, dass dies das Problem sein könnte, alles was ich vorschlage ist, dass es ein möglicher Grund dafür sein könnte. –

0

HashMap nicht THREAD ist, siehe the API documentation:

Beachten Sie, dass diese Implementierung nicht synchronisiert ist. Wenn mehrere Threads gleichzeitig auf eine Hash-Map zugreifen und mindestens einer der Threads die Map strukturell ändert, muss sie extern synchronisiert werden. (Eine strukturelle Änderung ist jede Operation, die eine oder mehrere Zuordnungen hinzufügt oder löscht; lediglich das Ändern des Werts eines Schlüssels, den eine Instanz bereits enthält, ist keine strukturelle Änderung.) Dies wird in der Regel durch die Synchronisierung eines Objekts erreicht, das die Zuordnung natürlich kapselt . Wenn kein solches Objekt vorhanden ist, sollte die Map mit der Collections.synchronizedMap-Methode "umgebrochen" werden. Dies ist am besten zum Zeitpunkt der Erstellung getan, versehentlichen nicht synchronisierten Zugriff auf die Karte, um zu verhindern:

Map m = Collections.synchronizedMap(new HashMap(...)); 

Die Einsätze in die Karte, die Sie beschreiben, als strukturelle Modifikationen zählen würde.

Verwenden Sie stattdessen eine , Updates sperren nicht die gesamte Datenstruktur, wie der obige Code mit der synchronizedMap wird.

Wenn das Problem besteht, dass der neue Wert nicht in den Cache gelangt, bevor andere Threads ihn verwenden müssen, nur weil die Threads in schneller Folge auf denselben Code zugreifen, ist es möglicherweise besser, mit dem Cache zu leben vermisst, als einen Engpass einzuführen. Es ist möglicherweise besser, das Ergebnis beim Einfügen nicht zwischenzuspeichern, sondern auf die erste ausgewählte Abfrage zu warten (in einer neuen Transaktion, nachdem die Einfügung festgeschrieben wurde). So vermeiden Sie den Fall, dass Sie einen Eintrag zu Ihrem Cache hinzufügen und die Transaktion rückgängig macht Sie erhalten ungültige Daten im Cache.

Es besteht auch die Gefahr, dass viele speicherspeichernde Einträge verwendet werden, die nicht verwendet werden. Sie könnten einen Worker-Thread regelmäßig nach abgelaufenen Elementen suchen lassen.

Caching ist eines der Dinge, die schwieriger sind, als es aussieht. Erwägen Sie die Verwendung von ehcache als Alternative zum Rollieren Ihrer eigenen Lösung hier.

Verwandte Themen