Нужен кеш для каждого запроса в Java - PullRequest
0 голосов
/ 14 октября 2019

Я разрабатываю REST API с использованием среды Java Spring.

При вызове этих API мне нужно проверить разрешения, где мне нужно будет сделать запрос к БД для получения данных о разрешениях. Дело в том, что есть несколько областей, проверяющих разрешение в одном запросе, и я не хочу делать несколько обращений к БД, поэтому я намерен кэшировать данные разрешений только для этого одного запроса.

IЯ пытался создать bean-объект области видимости запроса, который работает, но не во всех случаяхБывают случаи, когда bean-объект с областью запроса не может быть создан, например, при выполнении запланированного кода с использованием аннотации @Scheduled, просто потому, что это не запрос. Другой случай - при проверке разрешений с помощью WebSecurityConfigurerAdapter, компонент также не был создан в то время.

Итак, я рассмотрел другое возможное решение, а именно: https://github.com/rinoto/spring-request-cache. Если я использую этоРешение, мне нужно будет удалить кэш из threadLocal каждый раз, когда операция завершена. Мне не очень удобно использовать это решение, так как я не специалист по Java, и я прочитал, что не рекомендуется использовать threadLocal в качестве кэша.

Каков наилучший способ достижения моей цели? Мой вопрос прост, кешировать некоторые данные только для этого запроса. Есть ли библиотека, которая поддерживает это?

Мне трудно поверить, что мой запрос не является нормальным вариантом использования, или это не нормальный вариант использования?

1 Ответ

0 голосов
/ 14 октября 2019

В этом случае вы можете использовать ThreadLocal в качестве кэша. Нет необходимости очищать. Согласно документации

Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the {@code ThreadLocal} instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).

например: ThreadLocal<Map<String, Object>> THREAD_LOCAL_DATA = ThreadLocal.withInitial(HashMap::new)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...