Hallo Leute,
ich benutze eine LRUMap der jakarta Commons Collecion Map um eine Speichestruktur auf einem begrenzten
Verbrauchsniveau zu halten. Dies tue ich ein einem Servlet, so daß man davon ausgehen kann, daß meherere
Prozesse auf diesen "Cache" gleichzeitig zugreifen. In der Beschreibung der Klasse steht, daß diese adhoc nicht Thread Safe
ist. Ich habe nun folgenden Code der auf den Cache zugreift und sicherstellen soll, daß immer ein Objekt
zurückliefert wird daß daß nicht NULL ist und falls es im Cache nicht gefunden wird dieses nachlädet.
Erste Frage: Bei einer Konkurenz von Prozessen/ Threads kann es nun sein, daß das Objekt aus dem
Cache entfernt wird. Vermutilch währen der Schreiboperation
wird der Cache reorganiziert. Wo muß ich die Synchronization setzen, auf die Leseoperation
Zweite Frage: Wenn ich einen Cache der Tiefe/ Größe 64 habe und 128 Threads die auf das System zugreifen, ist die
Wahrscheinlichkeit hoch, daß der Cache in permateneter Überladung der Tabelle endet also nich mehr cached
(Oversampling by request). Gibt es einen etablierten Mechanisnus, der eine quasi optimale Cachgröße berechent (Anzahl der Einträge)
. .sowas wie das Sampling Theorem in der Stochasik/Signaltheorie, welches das mögliche erreichbare
Signalrauschabstandsverhältnis abschätzt..
Vielen Dank huckfinn
ich benutze eine LRUMap der jakarta Commons Collecion Map um eine Speichestruktur auf einem begrenzten
Verbrauchsniveau zu halten. Dies tue ich ein einem Servlet, so daß man davon ausgehen kann, daß meherere
Prozesse auf diesen "Cache" gleichzeitig zugreifen. In der Beschreibung der Klasse steht, daß diese adhoc nicht Thread Safe
ist. Ich habe nun folgenden Code der auf den Cache zugreift und sicherstellen soll, daß immer ein Objekt
zurückliefert wird daß daß nicht NULL ist und falls es im Cache nicht gefunden wird dieses nachlädet.
Code:
package ...
import org.apache.commons.collections.map.LRUMap;
.....
//__________________________________________________________________________
/** Der Dokumentencache */
private LRUMap documentCache = new LRUMap(defaultLRUMapSize);
...INITIALIZIRUNG
//__________________________________________________________________________
/** Zugriff auf den Dokumentencache */
public OaiDocumentRegisterEntry getCacheEntry(int docIdent)
throws OaiException {
OaiDocumentRegisterEntry result = null;
// ____Suche im Cache ____________
result = (OaiDocumentRegisterEntry)
documentCache.get(Integer.valueOf(docIdent));
// ____Nachladen von der Db und ablegen im Cache _______
if (result==null) {
result = loadDocumentEntry(docIdent);
documentCache.put(Integer.valueOf(docIdent),result);
}
return result;
}
Erste Frage: Bei einer Konkurenz von Prozessen/ Threads kann es nun sein, daß das Objekt aus dem
Cache entfernt wird. Vermutilch währen der Schreiboperation
Code:
documentCache.put(Integer.valueOf(docIdent),result);
Code:
result = (OaiDocumentRegisterEntry)
documentCache.get(Integer.valueOf(docIdent));
Zweite Frage: Wenn ich einen Cache der Tiefe/ Größe 64 habe und 128 Threads die auf das System zugreifen, ist die
Wahrscheinlichkeit hoch, daß der Cache in permateneter Überladung der Tabelle endet also nich mehr cached
(Oversampling by request). Gibt es einen etablierten Mechanisnus, der eine quasi optimale Cachgröße berechent (Anzahl der Einträge)
. .sowas wie das Sampling Theorem in der Stochasik/Signaltheorie, welches das mögliche erreichbare
Signalrauschabstandsverhältnis abschätzt..
Vielen Dank huckfinn