mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-21 06:27:36 +00:00
perf[storage]: 简化storage,让recycle的方式更加简洁
This commit is contained in:
@@ -43,8 +43,6 @@ public interface IStorageManager {
|
||||
@Nullable
|
||||
Storage<?, ?> getStorage(Class<?> clazz);
|
||||
|
||||
Map<Class<?>, Boolean> allStorageUsableMap();
|
||||
|
||||
Map<Class<?>, Storage<?, ?>> storageMap();
|
||||
|
||||
void updateStorage(Class<?> clazz, Storage<?, ?> storage);
|
||||
|
||||
@@ -60,11 +60,6 @@ public class StorageManager implements IStorageManager {
|
||||
*/
|
||||
private final Map<Class<?>, Storage<?, ?>> storageMap = new HashMap<>();
|
||||
|
||||
/**
|
||||
* 全部的Storage定义,key为对应的excel配置表,value为当前配置表是否在当前项目中使用
|
||||
*/
|
||||
private final Map<Class<?>, 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<Class<?>, 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);
|
||||
|
||||
@@ -32,18 +32,18 @@ public class Storage<K, V> {
|
||||
|
||||
private Class<V> clazz;
|
||||
|
||||
private final Map<K, V> dataMap = new HashMap<>();
|
||||
// 当前配置表是否在当前项目中使用,没有被使用的会清楚data数据,以达到节省内存的目的
|
||||
private boolean recycle = true;
|
||||
|
||||
private Map<K, V> dataMap = new HashMap<>();
|
||||
// 非唯一索引
|
||||
private final Map<String, Map<Object, List<V>>> indexMap = new HashMap<>();
|
||||
private Map<String, Map<Object, List<V>>> indexMap = new HashMap<>();
|
||||
// 唯一索引
|
||||
private final Map<String, Map<Object, V>> uniqueIndexMap = new HashMap<>();
|
||||
private Map<String, Map<Object, V>> uniqueIndexMap = new HashMap<>();
|
||||
|
||||
private IdDef idDef;
|
||||
private Map<String, IndexDef> indexDefMap;
|
||||
|
||||
public Storage() {
|
||||
}
|
||||
|
||||
public void init(InputStream inputStream, Class<?> resourceClazz, String suffix) {
|
||||
try {
|
||||
this.clazz = (Class<V>) resourceClazz;
|
||||
@@ -67,6 +67,23 @@ public class Storage<K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
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<V> getAll() {
|
||||
return Collections.unmodifiableCollection(dataMap.values());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user