Исключение одновременной модификации Ehcache с использованием Spring с приложением ehcache - PullRequest
0 голосов
/ 01 июля 2019

В моем приложении ehcache настроен так, как показано ниже.

<diskStore path="java.io.tmpdir" />
    <defaultCache name="defaut" maxElementsInMemory="5000" eternal="false" timeToIdleSeconds="360" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false" memoryStoreEvictionPolicy="LRU" />

    <cache name="userId" eternal="false" timeToIdleSeconds="600" overflowToDisk="true" maxElementsOnDisk="1000" memoryStoreEvictionPolicy="LRU" timeToLiveSeconds="1200" maxElementsInMemory="100"/>

с использованием кеша в классе обслуживания

@Cacheable(value = "userId",key="#p0")
    public User findById(long userId) {

        return getDao().findById(userId);
    }

и при обновлении данных мы очищаем кеш как

public User update(User user) {
    Objects.requireNonNull(cacheManager.getCache("companyId")).clear();
    return getDao().update(user);

    } 

и покаудаляя пользователя, мы также очищаем кеш, как этот

public void delete (пользователь) {

  Objects.requireNonNull(cacheManager.getCache("companyId")).clear();
  getDao().delete(user);

}

Но в одной из функций нам нужно удалить выбранного пользователя, и нам нужнообновить пользователя по одному, например

  public List<User> get updatedUsers(Long oldUser,Long newUser){

         userService.delete(oldUser); 
         userService.update(newUser);

         List<User> users = userService.findById(newUser);

         return users;
   }

Здесь мы получаем проблему, например

 2019-07-01 10:51:02.807 [find%0041By%0055Id.data] ERROR n.s.e.store.disk.DiskStorageFactory.call(488) - Disk Write of SimpleKey [] failed: 
net.sf.ehcache.CacheException: Failed to serialize element due to ConcurrentModificationException. This is frequently the result of inappropriately sharing thread unsafe object (eg. ArrayList, HashMap, etc) between threads
    at net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:405)
    at net.sf.ehcache.store.disk.DiskStorageFactory.write(DiskStorageFactory.java:385)
    at net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask.call(DiskStorageFactory.java:477)
    at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1071)
    at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1055)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.ConcurrentModificationException: null
    at java.util.ArrayList.writeObject(ArrayList.java:766)
    at sun.reflect.GeneratedMethodAccessor173.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
    at net.sf.ehcache.Element.writeObject(Element.java:875)
    at sun.reflect.GeneratedMethodAccessor172.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:97)
    at net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:403)
    ... 10 common frames omitted

Спасибо

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