This commit is contained in:
@@ -31,7 +31,8 @@ public final class EntityCache<T> {
|
|||||||
|
|
||||||
private final ConcurrentHashMap<Serializable, T> map = new ConcurrentHashMap();
|
private final ConcurrentHashMap<Serializable, T> map = new ConcurrentHashMap();
|
||||||
|
|
||||||
private final Collection<T> list = new ConcurrentLinkedQueue(); // CopyOnWriteArrayList 插入慢、查询快; 10w数据插入需要3.2秒; ConcurrentLinkedQueue 插入快、查询慢;10w数据查询需要 0.062秒, 查询慢40%;
|
// CopyOnWriteArrayList 插入慢、查询快; 10w数据插入需要3.2秒; ConcurrentLinkedQueue 插入快、查询慢;10w数据查询需要 0.062秒, 查询慢40%;
|
||||||
|
private final Collection<T> list = new ConcurrentLinkedQueue();
|
||||||
|
|
||||||
private final Map<String, Comparator<T>> sortComparators = new ConcurrentHashMap<>();
|
private final Map<String, Comparator<T>> sortComparators = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@@ -56,7 +57,8 @@ public final class EntityCache<T> {
|
|||||||
this.type = info.getType();
|
this.type = info.getType();
|
||||||
this.creator = info.getCreator();
|
this.creator = info.getCreator();
|
||||||
this.primary = info.primary;
|
this.primary = info.primary;
|
||||||
this.needcopy = true;
|
VirtualEntity ve = info.getType().getAnnotation(VirtualEntity.class);
|
||||||
|
this.needcopy = ve == null || !ve.direct();
|
||||||
this.newReproduce = Reproduce.create(type, type, (m) -> {
|
this.newReproduce = Reproduce.create(type, type, (m) -> {
|
||||||
try {
|
try {
|
||||||
return type.getDeclaredField(m).getAnnotation(Transient.class) == null;
|
return type.getDeclaredField(m).getAnnotation(Transient.class) == null;
|
||||||
@@ -81,10 +83,12 @@ public final class EntityCache<T> {
|
|||||||
if (info.fullloader == null) return;
|
if (info.fullloader == null) return;
|
||||||
clear();
|
clear();
|
||||||
List<T> all = info.fullloader.apply(type);
|
List<T> all = info.fullloader.apply(type);
|
||||||
|
if (all != null) {
|
||||||
all.stream().filter(x -> x != null).forEach(x -> {
|
all.stream().filter(x -> x != null).forEach(x -> {
|
||||||
this.map.put(this.primary.get(x), x);
|
this.map.put(this.primary.get(x), x);
|
||||||
});
|
});
|
||||||
this.list.addAll(all);
|
this.list.addAll(all);
|
||||||
|
}
|
||||||
this.fullloaded = true;
|
this.fullloaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,7 +123,6 @@ public final class EntityInfo<T> {
|
|||||||
|
|
||||||
private EntityInfo(Class<T> type, int nodeid, final boolean cacheForbidden, Properties conf, Function<Class, List> fullloader) {
|
private EntityInfo(Class<T> type, int nodeid, final boolean cacheForbidden, Properties conf, Function<Class, List> fullloader) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.fullloader = fullloader;
|
|
||||||
//---------------------------------------------
|
//---------------------------------------------
|
||||||
this.nodeid = nodeid >= 0 ? nodeid : 0;
|
this.nodeid = nodeid >= 0 ? nodeid : 0;
|
||||||
DistributeTables dt = type.getAnnotation(DistributeTables.class);
|
DistributeTables dt = type.getAnnotation(DistributeTables.class);
|
||||||
@@ -135,7 +134,15 @@ public final class EntityInfo<T> {
|
|||||||
Table t = type.getAnnotation(Table.class);
|
Table t = type.getAnnotation(Table.class);
|
||||||
if (type.getAnnotation(VirtualEntity.class) != null) {
|
if (type.getAnnotation(VirtualEntity.class) != null) {
|
||||||
this.table = null;
|
this.table = null;
|
||||||
|
Function<Class, List> loader = null;
|
||||||
|
try {
|
||||||
|
loader = type.getAnnotation(VirtualEntity.class).loader().newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.severe(type + " init @VirtualEntity.loader error", e);
|
||||||
|
}
|
||||||
|
this.fullloader = loader;
|
||||||
} else {
|
} else {
|
||||||
|
this.fullloader = fullloader;
|
||||||
this.table = (t == null) ? type.getSimpleName().toLowerCase() : (t.catalog().isEmpty()) ? t.name() : (t.catalog() + '.' + t.name());
|
this.table = (t == null) ? type.getSimpleName().toLowerCase() : (t.catalog().isEmpty()) ? t.name() : (t.catalog() + '.' + t.name());
|
||||||
}
|
}
|
||||||
this.creator = Creator.create(type);
|
this.creator = Creator.create(type);
|
||||||
@@ -180,8 +187,10 @@ public final class EntityInfo<T> {
|
|||||||
// }
|
// }
|
||||||
DistributeGenerator dg = field.getAnnotation(DistributeGenerator.class);
|
DistributeGenerator dg = field.getAnnotation(DistributeGenerator.class);
|
||||||
if (dg != null) {
|
if (dg != null) {
|
||||||
if (!field.getType().isPrimitive())
|
if (!field.getType().isPrimitive()) {
|
||||||
throw new RuntimeException(cltmp.getName() + "'s @" + DistributeGenerator.class.getSimpleName() + " primary must be primitive class type field");
|
throw new RuntimeException(cltmp.getName() + "'s @"
|
||||||
|
+ DistributeGenerator.class.getSimpleName() + " primary must be primitive class type field");
|
||||||
|
}
|
||||||
sqldistribute = true;
|
sqldistribute = true;
|
||||||
auto = false;
|
auto = false;
|
||||||
allocationSize0 = dg.allocationSize();
|
allocationSize0 = dg.allocationSize();
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ package org.redkale.source;
|
|||||||
import static java.lang.annotation.ElementType.TYPE;
|
import static java.lang.annotation.ElementType.TYPE;
|
||||||
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VirtualEntity表示虚拟的数据实体类, 通常Entity都会映射到数据库中的某个表,而标记为VirtualEntity的Entity类只存在DataCache中
|
* VirtualEntity表示虚拟的数据实体类, 通常Entity都会映射到数据库中的某个表,而标记为VirtualEntity的Entity类只存在DataCache中
|
||||||
@@ -22,4 +24,17 @@ import java.lang.annotation.*;
|
|||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
public @interface VirtualEntity {
|
public @interface VirtualEntity {
|
||||||
|
|
||||||
|
//DataSource是否直接返回对象的真实引用, 而不是copy一份
|
||||||
|
boolean direct() default false;
|
||||||
|
|
||||||
|
//初始化时数据的加载器
|
||||||
|
Class<? extends Function< Class, List>> loader() default DefaultFunctionLoader.class;
|
||||||
|
|
||||||
|
public static class DefaultFunctionLoader implements Function< Class, List> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List apply(Class u) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user