Как очистить память из кеша с помощью ehcache программно во время массовых транзакций? - PullRequest
0 голосов
/ 31 мая 2019

Требуется много времени, чтобы вставить в базу данных больше записей, например, 50000. Я гуглил и обнаружил, что, поскольку hibernate хранит объекты в своем кеше, в то время как любая вставка или обновление требует больше времени для вставки по мере увеличения количества записей. Мне нужно знать, под каким именем кеш будет сохраняться при вставке, чтобы я мог выселить с помощью аннотации @CacheEvict. Я использую ehcache.

Я обнаружил, что @CacheEvict можно использовать. Но я не знаю, под каким именем будет сохранен кеш для вставки. Я создал кэш в классе CacheConfiguration, но я не знаю, правильно ли это. Я обнаружил, что есть способ установить имя кэша, используя ehcache.xml, но мы его не используем. Я новичок в ehcache, Hibernate и Spring MVC. поэтому, пожалуйста, помогите мне.

//Setting cache name in CacheConfiguration class:
@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
    return cm -> {           
cm.createCache(com.cspl.cashflow.CashflowService.NAME,jcacheConfiguration);
             };
    }

//For loop for inserting:
public static final String NAME = "names";  
 @Cacheable("names")
 public void getNames() {
     logger.info("saving");
    for(int i=1; i<=50000;i++){
        List<Cashflow> cashflowList = new ArrayList<>();
        Cashflow order = new Cashflow(1, "Stark", "Tony", true)         
        cashflowList.add(order);
        cashflowRepository.save(cashflowList);
    if(i%1000==0) {
            evictAllCacheValues();
                }   
        }
     logger.info("saved");
            }

@CacheEvict(value = "names",  allEntries = true)
    public void evictAllCacheValues() {
                      }

//I have also tried using 
@Scheduled(cron = "0 0/30 * * * ?")       // execure after every 30 min 
public void clearCacheSchedule(){
   for(String name:cacheManager.getCacheNames()){
            cacheManager.getCache(name).clear();  // clear cache by name
                           }
                        }

Даже после выселения вставка занимает больше времени. я не знаю, правильны ли установка имени кэша и использование его в @Cacheable и @CacheEvict.

Заранее спасибо ....

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете попытаться очистить весь кеш, используя cache.removeAll().

. Чтобы сделать это программно, вы должны использовать это так.

Cache cache = getCache(cacheName); // <---- You have to get the instance of //Ehcache with Configuration
  if (null != cache) {
    cache.removeAll();
  }

Для получения более подробной информации, смотрите ссылку ниже,https://www.ehcache.org/apidocs/2.9/net/sf/ehcache/Ehcache.html#removeAll()

...