powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и EhCache
11 сообщений из 11, страница 1 из 1
Spring и EhCache
    #39648343
BoomLix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер. Только начал изучать кеширование на спринге, так что вопрос, возможно, довольно банальный.
Есть два селекта в базу, которые выполняются довольно часто. Хотелось бы их закешировать.
Просмотрев уроки, создал бины

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  
    @Bean
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    }

    @Bean
    public EhCacheManagerFactoryBean ehCacheCacheManager() {
        EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
        cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
        cmfb.setShared(true);
        return cmfb;
    }



Файл ehcache.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="false"
         monitoring="autodetect"
         dynamicConfig="true">

    <cache name="user"
           maxEntriesLocalHeap="30"
           eternal="false"
           timeToIdleSeconds="300" timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off">
        <persistence strategy="none" />
    </cache>
    <cache name="admin"
           maxEntriesLocalHeap="10"
           eternal="false"
           timeToIdleSeconds="300" timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off">
        <persistence strategy="none" />
    </cache>

</ehcache>



И аннотировал нужные методы:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    
@Cacheable(value="user")
    public User findUser(long id) {
        return dao.getUser();
    }
@Cacheable(value="admin")
    public Admin findAdmin(long id) {
        return dao.getAdmin();
    }



Вопрос первый - не надо ли как-то разруливать кэши? Достаточно ли просто указать разные имена и они будут спокойно применяться на разных методах?
Вопрос второй - если кэш не имеет значения и два потока одновременно обратятся к методу, оба пойдут искать значение в базу. Мне казалось, что можно как-то, подобно синхронизации на java, залочить кэш. Но найти эту настройку не удалось. Или же ее нет?
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648379
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoomLixВопрос второй - если кэш не имеет значения и два потока одновременно обратятся к методу, оба пойдут искать значение в базу. Мне казалось, что можно как-то, подобно синхронизации на java, залочить кэш. Но найти эту настройку не удалось. Или же ее нет?

Вам возможно надо посмотреть сценарий для @CachePut

На самом деле, то что Вы спрашиваете не имеет смысла если следовать грамматике русского языка и логики транзакций для кеша и базы данных.

К слову сказать все давно уже пишут кеш на Редисе. Вот мой популярный пример для редиса написанный три года назад.

https://github.com/SVyatkin/predix-jpa-cf
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648478
BoomLix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergunka, @CachePut мне вряд ли поможет. Насколько я понимаю, метод, аннотированный @CachePut все равно вызывается. То есть если в методе есть запрос в базу, он будет производиться всегда, а результат его будет кэшироваться. Проблема в том, что именно частых запросов я и хочу избежать. Да и кроме этого метода у меня этот кэш больше нигде не используется, так что пользоваться результатом @CachePut будет некому.


SergunkaНа самом деле, то что Вы спрашиваете не имеет смысла если следовать грамматике русского языка и логики транзакций для кеша и базы данных.
Я еще только разбираюсь с кэшем, так что могу (и, скорее всего) что-то не так понимать. Поясните пожалуйста, что именно не так?
Мне казалось, что кеш будет работать так:
Первый поток заходит в метод, идет в базу, получает данные и кэширует их.
Второй поток с таким же значением приходит к методу, смотрит кэш, видит, что там уже есть значение и возвращает его. Обращение к базе не происходит.

У меня же получается, что и первый, и второй потоки вызывают метод и обращаются в базу
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648516
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо втаскивать в топик Redis. Это не поможет автору в решении его вопроса.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648873
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, в кешменегере каждый кеш надо сконфигурировать либо через код, либо xml.

Через код удобнее, можно сделать одну функцию на все кеши.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648876
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается сихнронизации, в доке спринга сказано :

Код: java
1.
2.
@Cacheable(cacheNames="foos", sync=true)
public Foo executeExpensiveOperation(String id) {...}



Synchronized caching

In a multi-threaded environment, certain operations might be concurrently invoked for the same argument (typically on startup). By default, the cache abstraction does not lock anything and the same value may be computed several times, defeating the purpose of caching.

For those particular cases, the sync attribute can be used to instruct the underlying cache provider to lock the cache entry while the value is being computed. As a result, only one thread will be busy computing the value while the others are blocked until the entry is updated in the cache.

This is an optional feature and your favorite cache library may not support it . All CacheManager implementations provided by the core framework support it. Check the documentation of your cache provider for more details.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648940
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняЧто касается сихнронизации, в доке спринга сказано :

Код: java
1.
2.
@Cacheable(cacheNames="foos", sync=true)
public Foo executeExpensiveOperation(String id) {...}



Synchronized caching

In a multi-threaded environment, certain operations might be concurrently invoked for the same argument (typically on startup). By default, the cache abstraction does not lock anything and the same value may be computed several times, defeating the purpose of caching.

For those particular cases, the sync attribute can be used to instruct the underlying cache provider to lock the cache entry while the value is being computed. As a result, only one thread will be busy computing the value while the others are blocked until the entry is updated in the cache.

This is an optional feature and your favorite cache library may not support it . All CacheManager implementations provided by the core framework support it. Check the documentation of your cache provider for more details.

Отличный комент.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648951
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoomLixУ меня же получается, что и первый, и второй потоки вызывают метод и обращаются в базу

У Вас возникает race condition устоявшийся термин в индустрии. Если Ваш кеш поддерживает параметр sync - то повезло.
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

Вообще достичь рейс кондишинс в тестировании довольно нетривиально.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648982
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рано говорить о race condition. Автор пишет что только изучает spring+ehcache.
...
Рейтинг: 0 / 0
Spring и EhCache
    #39648998
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonРано говорить о race condition. Автор пишет что только изучает spring+ehcache.

откуда знаешь, что рано ? может его, как junior-а, бросили на задачу
...
Рейтинг: 0 / 0
Spring и EhCache
    #39649032
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен пруф.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и EhCache
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]