EN · DE · RU · FR · ES

#825: AddressImageCache.kt

projectforge-business/src/main/kotlin/org/projectforge/business/address/AddressImageCache.kt @Component — Anwendungsweiter Cache, projectforge-business/src/main/kotlin/org/projectforge/business/address/AddressImageCache.kt 102 Zeilen · 54 Code · 38 Kommentare · 10 leer
In-Memory-Cache, der Adress-IDs auf AddressImageDO-Metadaten abbildet (ohne binäre Bilddaten). Bietet schnelle Abfragen, ob eine Adresse ein Bild hat und welchen Typ es besitzt.

Architektur

AddressImageCache erweitert AbstractCache, die Basisklasse von ProjectForge für aktualisierbare Caches. Das Framework ruft refresh() periodisch oder bei Bedarf auf, synchronisiert, um gleichzeitige Änderungen zu verhindern.

Datenmodell

Der Cache speichert eine Map<Long, AddressImageDO>, wobei jeder Wert ein leichtgewichtiges AddressImageDO ist, das nur enthält:

Binärdaten sind ausgeschlossen — weder preview- noch image-Byte-Arrays werden geladen. Dies hält den Cache speichereffizient, während die Frage „Hat Adresse X ein Bild?“ sofort beantwortet werden kann.

Aktualisierungsstrategie

refresh() wird innerhalb eines schreibgeschützten, isolierten Persistenzkontexts ausgeführt (für saubere Transaktionsgrenzen). Es verwendet eine JPQL-Abfrage, die addressId, lastUpdate und imageType als Tuple-Projektion auswählt und die gesamte Karte atomar neu aufbaut, um Probleme durch gleichzeitiges Lesen zu vermeiden.

Verwendung

getImage(addressId) ist die einzige öffentliche API. Sie ruft checkRefresh() (von AbstractCache geerbt) auf, um die Aktualität vor dem Nachschlagen in der Karte sicherzustellen. Ein Null-Rückgabewert bedeutet, dass für diese Adresse kein Bild existiert.

Singleton-Zugriff

Das Companion-Objekt enthält eine lateinit var instance, die in @PostConstruct gesetzt wird, um statischen Zugriff aus Code zu ermöglichen, der keine Spring-Injektion verwenden kann.

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelltext-Dateiköpfe: 2024 -> 2025.
943947aaa Adressen: Unterstützung von GIF und JPEG
0ceceb28f Alle Cache-Aktualisierungen laufen jetzt in isolierten Transaktionen
5989b32fd BaseDao: Mechanismus von onChangeListener umgestaltet.
1b50060c3 BaseDao: umbenannt: get -> find, save -> insert, getList -> select, load -> select