diff --git a/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java b/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java index 82e45fdd7..c6f99f194 100644 --- a/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java +++ b/src/main/java/io/ebeaninternal/server/cache/CacheChangeBeanRemove.java @@ -2,6 +2,9 @@ package io.ebeaninternal.server.cache; import io.ebeaninternal.server.deploy.BeanDescriptor; +import java.util.ArrayList; +import java.util.Collection; + /** * Change to remove bean from L2 cache. */ @@ -9,15 +12,35 @@ class CacheChangeBeanRemove implements CacheChange { private final BeanDescriptor descriptor; - private final Object id; + private final Collection ids; - CacheChangeBeanRemove(BeanDescriptor descriptor, Object id) { + CacheChangeBeanRemove(Object id, BeanDescriptor descriptor) { this.descriptor = descriptor; - this.id = id; + this.ids = new ArrayList<>(); + ids.add(id); + } + + CacheChangeBeanRemove(BeanDescriptor descriptor, Collection ids) { + this.descriptor = descriptor; + this.ids = ids; } @Override public void apply() { - descriptor.cacheHandleDeleteById(id); + descriptor.cacheApplyInvalidate(ids); + } + + /** + * Add more id values. + */ + public void addIds(Collection moreIds) { + ids.addAll(moreIds); + } + + /** + * Add another id value. + */ + public void addId(Object id) { + ids.add(id); } } diff --git a/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java b/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java index 45956d181..d917756d1 100644 --- a/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java +++ b/src/main/java/io/ebeaninternal/server/cache/CacheChangeSet.java @@ -3,6 +3,7 @@ package io.ebeaninternal.server.cache; import io.ebeaninternal.server.deploy.BeanDescriptor; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -21,6 +22,8 @@ public class CacheChangeSet { private final Set> queryCaches = new HashSet<>(); + private final Map, CacheChangeBeanRemove> beanRemoveMap = new HashMap<>(); + private final Map manyChangeMap = new HashMap<>(); private final long modificationTimestamp; @@ -54,6 +57,9 @@ public class CacheChangeSet { for (CacheChange entry : manyChangeMap.values()) { entry.apply(); } + for (CacheChange entry : beanRemoveMap.values()) { + entry.apply(); + } } /** @@ -102,8 +108,26 @@ public class CacheChangeSet { * Remove a bean from the cache. */ public void addBeanRemove(BeanDescriptor desc, Object id) { - touchedTables.add(desc.getBaseTable()); - entries.add(new CacheChangeBeanRemove(desc, id)); + CacheChangeBeanRemove entry = beanRemoveMap.get(desc); + if (entry != null) { + entry.addId(id); + } else { + beanRemoveMap.put(desc, new CacheChangeBeanRemove(id, desc)); + touchedTables.add(desc.getBaseTable()); + } + } + + /** + * Remove a bean from the cache. + */ + public void addBeanRemoveMany(BeanDescriptor desc, Collection ids) { + CacheChangeBeanRemove entry = beanRemoveMap.get(desc); + if (entry != null) { + entry.addIds(ids); + } else { + beanRemoveMap.put(desc, new CacheChangeBeanRemove(desc, ids)); + touchedTables.add(desc.getBaseTable()); + } } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 2cf11026b..96285d3f9 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1472,15 +1472,15 @@ public class BeanDescriptor implements BeanType, STreeType { /** * Remove a bean from the cache given its Id. */ - public void cacheHandleDeleteById(Object id) { - cacheHelp.beanCacheRemove(id); + public void cacheHandleDeleteByIds(Collection ids, CacheChangeSet changeSet) { + cacheHelp.handleDeleteIds(ids, changeSet); } /** * Remove a collection of beans from the cache given the ids. */ - public void cacheHandleInvalidate(Collection ids) { - cacheHelp.beanCacheInvalidate(ids); + public void cacheApplyInvalidate(Collection ids) { + cacheHelp.beanCacheApplyInvalidate(ids); } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index d10bd85a6..79cdf45e7 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -683,7 +683,7 @@ final class BeanDescriptorCacheHelp { /** * Remove a bean from the cache given its Id. */ - void beanCacheInvalidate(Collection ids) { + void beanCacheApplyInvalidate(Collection ids) { if (beanCache != null) { if (beanLog.isDebugEnabled()) { beanLog.debug(" REMOVE {}({})", cacheName, ids); @@ -695,21 +695,6 @@ final class BeanDescriptorCacheHelp { } } - /** - * Remove a bean from the cache given its Id. - */ - void beanCacheRemove(Object id) { - if (beanCache != null) { - if (beanLog.isDebugEnabled()) { - beanLog.debug(" REMOVE {}({})", cacheName, id); - } - beanCache.remove(id); - } - for (BeanPropertyAssocOne imported : propertiesOneImported) { - imported.cacheClear(); - } - } - /** * Returns true if it managed to populate/load the bean from the cache. */ @@ -740,12 +725,12 @@ final class BeanDescriptorCacheHelp { /** * Add appropriate cache changes to support delete by id. */ - void handleDelete(Object id, CacheChangeSet changeSet) { + void handleDeleteIds(Collection ids, CacheChangeSet changeSet) { if (invalidateQueryCache) { changeSet.addInvalidate(desc); } else { if (beanCache != null) { - changeSet.addBeanRemove(desc, id); + changeSet.addBeanRemoveMany(desc, ids); } cacheDeleteImported(true, null, changeSet); } diff --git a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java index b4da3e13d..1fe930fc6 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java +++ b/src/main/java/io/ebeaninternal/server/transaction/BeanPersistIds.java @@ -131,7 +131,7 @@ public class BeanPersistIds implements BinaryWritable { // any change invalidates the query cache beanDescriptor.clearQueryCache(); if (ids != null) { - beanDescriptor.cacheHandleInvalidate(ids); + beanDescriptor.cacheApplyInvalidate(ids); } } } diff --git a/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java b/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java index edbe8a2c9..5f76c4b03 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java +++ b/src/main/java/io/ebeaninternal/server/transaction/DeleteByIdMap.java @@ -29,8 +29,7 @@ public final class DeleteByIdMap { BeanDescriptor d = deleteIds.getBeanDescriptor(); List idValues = deleteIds.getIds(); if (idValues != null) { - d.queryCacheClear(changeSet); - d.cacheHandleInvalidate(idValues); + d.cacheHandleDeleteByIds(idValues, changeSet); } } }