From 63d0544696b41dd892a05077ab00b038befd30e0 Mon Sep 17 00:00:00 2001 From: godotg Date: Wed, 26 Oct 2022 18:27:52 +0800 Subject: [PATCH] =?UTF-8?q?perf[storage]:=20=E7=AE=80=E5=8C=96storage?= =?UTF-8?q?=EF=BC=8C=E8=AE=A9recycle=E7=9A=84=E6=96=B9=E5=BC=8F=E6=9B=B4?= =?UTF-8?q?=E5=8A=A0=E7=AE=80=E6=B4=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfoo/storage/manager/IStorageManager.java | 2 -- .../zfoo/storage/manager/StorageManager.java | 34 +++++++------------ .../com/zfoo/storage/model/vo/Storage.java | 29 ++++++++++++---- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java index 042875ce..668c0d2d 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/IStorageManager.java @@ -43,8 +43,6 @@ public interface IStorageManager { @Nullable Storage getStorage(Class clazz); - Map, Boolean> allStorageUsableMap(); - Map, Storage> storageMap(); void updateStorage(Class clazz, Storage storage); diff --git a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java index 39382ab7..5ace4841 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java @@ -60,11 +60,6 @@ public class StorageManager implements IStorageManager { */ private final Map, Storage> storageMap = new HashMap<>(); - /** - * 全部的Storage定义,key为对应的excel配置表,value为当前配置表是否在当前项目中使用 - */ - private final Map, Boolean> allStorageUsableMap = new HashMap<>(); - public StorageConfig getStorageConfig() { return storageConfig; } @@ -105,7 +100,6 @@ public class StorageManager implements IStorageManager { Storage storage = new Storage<>(); storage.init(resource.getInputStream(), definition.getClazz(), fileExtName); storageMap.putIfAbsent(clazz, storage); - allStorageUsableMap.put(clazz, false); } } catch (Exception e) { throw new RuntimeException(e); @@ -155,7 +149,7 @@ public class StorageManager implements IStorageManager { ReflectionUtils.makeAccessible(field); ReflectionUtils.setField(field, bean, storage); - allStorageUsableMap.put(resourceClazz, true); + storage.setRecycle(false); }); } } @@ -163,28 +157,27 @@ public class StorageManager implements IStorageManager { @Override public void initAfter() { if (storageConfig.isRecycle()) { - allStorageUsableMap.entrySet().stream() - .filter(it -> !it.getValue()) - .map(it -> it.getKey()) - .forEach(it -> storageMap.remove(it)); + storageMap.entrySet().stream() + .filter(it -> it.getValue().isRecycle()) + .map(it -> it.getValue()) + .forEach(it -> it.recycleStorage()); + } else { + storageMap.entrySet().stream() + .map(it -> it.getValue()) + .forEach(it -> it.setRecycle(false)); } } @Override public Storage getStorage(Class clazz) { - var usable = allStorageUsableMap.get(clazz); - if (usable == null) { + var storage = storageMap.get(clazz); + if (storage == null) { throw new RunException("没有定义[{}]的Storage,无法获取", clazz.getCanonicalName()); } - if (!usable) { + if (storage.isRecycle()) { throw new RunException("Storage没有使用[{}],为了节省内存提前释放了它;只有使用ResInjection注解的Storage才能被动态获取或者关闭配置recycle属性", clazz.getCanonicalName()); } - return storageMap.get(clazz); - } - - @Override - public Map, Boolean> allStorageUsableMap() { - return allStorageUsableMap; + return storage; } @Override @@ -192,7 +185,6 @@ public class StorageManager implements IStorageManager { return storageMap; } - @Override public void updateStorage(Class clazz, Storage storage) { storageMap.put(clazz, storage); diff --git a/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java b/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java index d13d1220..311f3534 100644 --- a/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java +++ b/storage/src/main/java/com/zfoo/storage/model/vo/Storage.java @@ -32,18 +32,18 @@ public class Storage { private Class clazz; - private final Map dataMap = new HashMap<>(); + // 当前配置表是否在当前项目中使用,没有被使用的会清楚data数据,以达到节省内存的目的 + private boolean recycle = true; + + private Map dataMap = new HashMap<>(); // 非唯一索引 - private final Map>> indexMap = new HashMap<>(); + private Map>> indexMap = new HashMap<>(); // 唯一索引 - private final Map> uniqueIndexMap = new HashMap<>(); + private Map> uniqueIndexMap = new HashMap<>(); private IdDef idDef; private Map indexDefMap; - public Storage() { - } - public void init(InputStream inputStream, Class resourceClazz, String suffix) { try { this.clazz = (Class) resourceClazz; @@ -67,6 +67,23 @@ public class Storage { } } + public void recycleStorage() { + recycle = true; + dataMap = null; + indexMap = null; + uniqueIndexMap = null; + idDef = null; + indexDefMap = null; + } + + public boolean isRecycle() { + return recycle; + } + + public void setRecycle(boolean recycle) { + this.recycle = recycle; + } + public Collection getAll() { return Collections.unmodifiableCollection(dataMap.values()); }