使用Spring和ehcache应用程序的ehcache并发修改异常

时间:2019-07-01 11:04:01

标签: java spring ehcache

在我的应用程序中,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);

    } 

在删除用户的同时,我们也像这样清除缓存

公共无效删除(用户){

  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

谢谢

0 个答案:

没有答案