EN · DE · RU · FR · ES

#825: AddressImageCache.kt

projectforge-business/src/main/kotlin/org/projectforge/business/address/AddressImageCache.kt @Component — Кэш уровня приложения, projectforge-business/src/main/kotlin/org/projectforge/business/address/AddressImageCache.kt 102 строки · 54 кода · 38 комментариев · 10 пустых
Кэш в памяти, сопоставляющий идентификаторы адресов с метаданными AddressImageDO (исключая двоичные данные изображений). Обеспечивает быстрый поиск наличия изображения у адреса и его типа.

Архитектура

AddressImageCache расширяет AbstractCache — базовый класс ProjectForge для обновляемых кэшей. Фреймворк вызывает refresh() периодически или по требованию, синхронизируя вызовы для предотвращения конкурентных изменений.

Модель данных

Кэш хранит Map<Long, AddressImageDO>, где каждое значение — это облегчённый AddressImageDO, содержащий только:

Двоичные данные исключены — ни preview, ни image массивы байтов не загружаются. Это сохраняет эффективность использования памяти кэшем, одновременно мгновенно отвечая на запросы «есть ли у адреса X изображение?».

Стратегия обновления

refresh() выполняется внутри изолированного контекста персистентности только для чтения (для чистых границ транзакций). Он использует JPQL-запрос, выбирающий addressId, lastUpdate и imageType как проекцию Tuple, атомарно перестраивая всю карту во избежание проблем конкурентного чтения.

Использование

getImage(addressId) — единственный публичный API. Он вызывает checkRefresh() (унаследованный от AbstractCache) для проверки актуальности перед поиском в карте. Возврат null означает, что изображение для данного адреса отсутствует.

Доступ через синглтон

Объект-компаньон содержит lateinit var instance, устанавливаемый в @PostConstruct, что обеспечивает статический доступ из кода, не использующего внедрение Spring.

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
943947aaa Адреса: поддержка gif и jpeg
0ceceb28f Все обновления кэша теперь выполняются в изолированных транзакциях
5989b32fd BaseDao: механизм onChangeLister реорганизован.
1b50060c3 BaseDao: переименовано: get -> find, save -> insert, getList -> select, load -> select