This commit is contained in:
kamhung
2015-11-26 10:33:10 +08:00
parent f8f680893c
commit 8aca1ff103
3 changed files with 0 additions and 70 deletions

View File

@@ -31,8 +31,6 @@ public final class EntityCache<T> {
private final Collection<T> list = new ConcurrentLinkedQueue(); // CopyOnWriteArrayList 插入慢、查询快; 10w数据插入需要3.2秒; ConcurrentLinkedQueue 插入快、查询慢10w数据查询需要 0.062秒, 查询慢40%;
private final HashMap<UniqueAttribute<T>, ConcurrentHashMap<Serializable, Collection<T>>> uniques = new HashMap<>();
private final Map<String, Comparator<T>> sortComparators = new ConcurrentHashMap<>();
private final Class<T> type;
@@ -65,24 +63,13 @@ public final class EntityCache<T> {
return false;
}
});
for (Unique unique : type.getAnnotationsByType(Unique.class)) {
final String[] cols = unique.columns();
final Attribute<T, Serializable>[] attrs = new Attribute[cols.length];
for (int i = 0; i < attrs.length; i++) {
attrs[i] = info.getAttribute(cols[i]);
if (info.getUpdateAttribute(cols[i]) != null) throw new RuntimeException(type + "." + cols[i] + " unique but can be updatable");
}
this.uniques.put(UniqueAttribute.create(attrs), new ConcurrentHashMap<>());
}
}
public void fullLoad(List<T> all) {
if (all == null) return;
clear();
final HashMap<UniqueAttribute<T>, ConcurrentHashMap<Serializable, Collection<T>>> localUniques = this.uniques;
all.stream().filter(x -> x != null).forEach(x -> {
this.map.put(this.primary.get(x), x);
localUniques.forEach((k, v) -> v.computeIfAbsent(k.getValue(x), (c) -> new ConcurrentLinkedQueue<>()).add(x));
});
this.list.addAll(all);
this.fullloaded = true;
@@ -95,7 +82,6 @@ public final class EntityCache<T> {
public void clear() {
this.fullloaded = false;
this.list.clear();
this.uniques.values().forEach(x -> x.clear());
this.map.clear();
}
@@ -363,7 +349,6 @@ public final class EntityCache<T> {
T old = this.map.put(this.primary.get(rs), rs);
if (old == null) {
this.list.add(rs);
this.uniques.forEach((k, v) -> v.computeIfAbsent(k.getValue(rs), (c) -> new ConcurrentLinkedQueue<>()).add(rs));
} else {
logger.log(Level.WARNING, "cache repeat insert data: " + value);
}
@@ -373,10 +358,6 @@ public final class EntityCache<T> {
if (id == null) return;
final T rs = this.map.remove(id);
if (rs != null) this.list.remove(rs);
this.uniques.forEach((k, v) -> v.computeIfPresent(k.getValue(rs), (x, u) -> {
u.remove(rs);
return u;
}));
}
public Serializable[] delete(final FilterNode node) {
@@ -389,10 +370,6 @@ public final class EntityCache<T> {
ids[++i] = this.primary.get(t);
this.map.remove(ids[i]);
this.list.remove(t);
this.uniques.forEach((k, v) -> v.computeIfPresent(k.getValue(t), (x, u) -> {
u.remove(t);
return u;
}));
}
return ids;
}

View File

@@ -1,24 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.wentch.redkale.source;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
*
* @author zhangjx
*/
@Inherited
@Documented
@Target({FIELD})
@Retention(RUNTIME)
@Repeatable(Uniques.class)
public @interface Unique {
String[] columns();
}

View File

@@ -1,23 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.wentch.redkale.source;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
*
* @author zhangjx
*/
@Inherited
@Documented
@Target({FIELD})
@Retention(RUNTIME)
public @interface Uniques {
Unique[] value();
}