powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring @Cacheable ключ
12 сообщений из 12, страница 1 из 1
Spring @Cacheable ключ
    #39186841
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой вот примерчик:

http://nikcode.blogspot.ru/2012/12/spring-cache.html

Допустим, у нас есть такая сущность:

Код: java
1.
2.
3.
4.
5.
6.
7.
public class Transaction {

    private final long id;
    private final long amount;

    // constructor & getters
}




И следующий интерфейс для DAO:
Код: java
1.
2.
3.
4.
5.
public interface TransactionDao {

    Transaction getById(long id);
    void save(Transaction tx);
}



имплементация:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class TransactionDaoImpl implements TransactionDao {

    private final List<Transaction> txs = new CopyOnWriteArrayList<>();
    
    @Override
    @Cacheable("transactions")
    public Transaction getById(long id) {
        // inefficient search imitation
        for (Transaction tx : txs) {
            if (tx.getId() == id) {
                return tx;
            }
        }
        return null;
    }

    @Override
    public void save(Transaction tx) {
        txs.add(tx);
    }
}




тут пока что всё ясно.
На каждый вызов метода getById происходит сначала обращение к кешу. Кеш это мапа, которая в качестве ключа использует аргумент метода.

Если есть метод, который модифицирует наши объекты, то мы должны навесить на него аннотацию @CashEvict:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Override
@CacheEvict(value = "transactions", key = "#tx.id")
public void update(Transaction tx) {
    for (int i = 0; i < txs.size(); i++) {
        if (txs.get(i).getId() == tx.getId()) {
            txs.set(i, tx);
        }
    }
}



Я так понимаю, что ключ кеша должен выбираться так, чтобы уникально определять сущность.

А что делать если ключ составной?
Что делать если ключ это сложный объект?( equals / hashcode ?)
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39186879
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что делать если мне скажем надо обновить у всех энтитей одно поле только

Какую аннотацию мне надо навесить?
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39186889
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, эта транзакция лучше выполняется на стороне БД.
Тоесть

Код: java
1.
SQL> update myentities set field='value' where ......;
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39186890
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ещё из доки не понял:

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#cache-annotations-cacheable 35.3.4 @Caching annotation

There are cases when multiple annotations of the same type, such as @CacheEvict or @CachePut need to be specified, for example because the condition or the key expression is different between different caches. Unfortunately Java does not support such declarations however there is a workaround - using an enclosing annotation, in this case, @Caching. @Caching allows multiple nested @Cacheable, @CachePut and @CacheEvict to be used on the same method:

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)

Ну понятно, что на момент написания доки не было repeatable annotations

Но что конкретно значит такая декларация?


автор@CacheEvict("primary")

это типа почисти "primary" кеш. По какому условию? весь?
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39186893
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Repeatable появились начиная с Java 8

https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Repeatable.html
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39187176
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonquestioner, эта транзакция лучше выполняется на стороне БД.
Тоесть

Код: java
1.
SQL> update myentities set field='value' where ......;



Как это связано с вопросом?
maytonRepeatable появились начиная с Java 8
именно
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39187225
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerКак это связано с вопросом?

А ладно забей. Если эта магия связанная с миграцией БД или апгрейдом версии - то сделал-бы
через механизмы SQL. Но на bulk-операциях ORM-ы всегда работали плохо.
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39189196
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

вопрос с базой вообще не связан)
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39246566
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Как в итоге решил?
у меня другая проблема. Я поставил над методом findAll кешировать рузультат И через какое то время честь обектов перестает возвращаться ... Т.е возвращалось 15 а через несколько итераций стало возвращаться 1

Кеш стандартный аннотации спринг



https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39251299
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1questioner,

Как в итоге решил?
у меня другая проблема. Я поставил над методом findAll кешировать рузультат И через какое то время честь обектов перестает возвращаться ... Т.е возвращалось 15 а через несколько итераций стало возвращаться 1

Кеш стандартный аннотации спринг



https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support

Изначальный вопрос нерешаем честно судя по всему. частично обновить поле нельзя. Только целиком
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39253940
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Нужно внимательнее читать доки по спрингу


Так же писать тесты

Так же задуматься о переходе на стандартные аннотации кеширования jsr 107


https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support


https://habrahabr.ru/post/113945/

Чтобы что то обвить нужно узать @CachePut который прозрачно оьновляет значение в бд и в кеше

@CacheEvict @CacheRemove удаляет из кеша по параметрам обновляя кеш



Составной ключ работает отлично через spel язык чисто у спринговых аннотаций куча параметров для настройки ключей итд
...
Рейтинг: 0 / 0
Spring @Cacheable ключ
    #39253996
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Cacheable(value="books", key="T(someType).hash(#isbn)") 
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)



	

After some limited testing with Spring 3.2, it seems one can use a SpEL list: {..., ..., ...}. This can also include null values. Spring passes the list as the key to the actual cache implementation. When using Ehcache, such will at some point invoke List#hashCode(), which takes all its items into account. (I am not sure if Ehcache only relies on the hash code.)

I use this for a shared cache, in which I include the method name in the key as well, which the Spring default key generator does not include. This way I can easily wipe the (single) cache, without (too much...) risking matching keys for different methods. Like:

@Cacheable(value="bookCache", 
  key="{ #root.methodName, #isbn?.id, #checkWarehouse }")
public Book findBook(ISBN isbn, boolean checkWarehouse) 
...

@Cacheable(value="bookCache", 
  key="{ #root.methodName, #asin, #checkWarehouse }")
public Book findBookByAmazonId(String asin, boolean checkWarehouse)




http://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments

+ свой

CacheKeyGenerator



Код: java
1.
2.
3.
4.
@Cacheable(value="bookCache", key="#checkwarehouse.toString().append(#isbn.toString())")


@Cacheable(value="bookCache", key="isbn + '_' + checkWarehouse + '_' + includeUsed")
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring @Cacheable ключ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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