diff --git a/src/com/wentch/redkale/source/DataJDBCSource.java b/src/com/wentch/redkale/source/DataJDBCSource.java index 642c0cf63..d6734bc2b 100644 --- a/src/com/wentch/redkale/source/DataJDBCSource.java +++ b/src/com/wentch/redkale/source/DataJDBCSource.java @@ -62,8 +62,6 @@ public final class DataJDBCSource implements DataSource { private final JDBCPoolSource writePool; - final List cacheClasses = new ArrayList<>(); - @Resource(name = "property.datasource.nodeid") int nodeid; @@ -164,7 +162,7 @@ public final class DataJDBCSource implements DataSource { for (Map.Entry en : readprop.entrySet()) { if ("cache".equalsIgnoreCase(en.getValue().toString())) { try { - cacheClasses.add(Class.forName(en.getKey().toString())); + EntityInfo.cacheClasses.add(Class.forName(en.getKey().toString())); } catch (Exception e) { } } @@ -179,7 +177,7 @@ public final class DataJDBCSource implements DataSource { for (Map.Entry en : readprop.entrySet()) { if ("cache".equalsIgnoreCase(en.getValue().toString())) { try { - cacheClasses.add(Class.forName(en.getKey().toString())); + EntityInfo.cacheClasses.add(Class.forName(en.getKey().toString())); } catch (Exception e) { } } @@ -339,8 +337,10 @@ public final class DataJDBCSource implements DataSource { } } + private final Function fullloader = (t) -> queryList(t, null); + private EntityInfo loadEntityInfo(Class clazz) { - return EntityInfo.load(clazz, this); + return EntityInfo.load(clazz, this.nodeid, fullloader); } /** @@ -351,7 +351,7 @@ public final class DataJDBCSource implements DataSource { */ @Override public void refreshCache(Class clazz) { - EntityInfo info = EntityInfo.load(clazz, this); + EntityInfo info = EntityInfo.load(clazz, this.nodeid, fullloader); EntityCache cache = info.getCache(); if (cache == null) return; cache.fullLoad(queryList(clazz, null)); @@ -505,7 +505,7 @@ public final class DataJDBCSource implements DataSource { public void insertCache(T... values) { if (values.length == 0) return; - final EntityInfo info = EntityInfo.load((Class) values[0].getClass(), this); + final EntityInfo info = EntityInfo.load((Class) values[0].getClass(), this.nodeid, fullloader); final EntityCache cache = info.getCache(); if (cache == null) return; for (T value : values) { @@ -2153,7 +2153,7 @@ public final class DataJDBCSource implements DataSource { } public EntityXXInfo(DataJDBCSource source, Class type) { - this.inner = EntityInfo.load(type, source); + this.inner = EntityInfo.load(type, source.nodeid, null); this.nodeid = source.nodeid; DistributeTables dt = type.getAnnotation(DistributeTables.class); this.distributeTables = dt == null ? null : dt.value(); diff --git a/src/com/wentch/redkale/source/DataJPASource.java b/src/com/wentch/redkale/source/DataJPASource.java index 4fd9f059e..8dc2dc064 100644 --- a/src/com/wentch/redkale/source/DataJPASource.java +++ b/src/com/wentch/redkale/source/DataJPASource.java @@ -269,7 +269,7 @@ final class DataJPASource implements DataSource { * * @param * @param clazz - * @param ids 主键值 + * @param ids 主键值 */ @Override public void delete(Class clazz, Serializable... ids) { @@ -519,7 +519,7 @@ final class DataJPASource implements DataSource { final CriteriaBuilder builder = manager.getCriteriaBuilder(); CriteriaUpdate cd = builder.createCriteriaUpdate(clazz); cd.set(column, value); - cd.where(builder.equal(cd.from(clazz).get(EntityInfo.load(clazz, this).getPrimary().field()), id)); + cd.where(builder.equal(cd.from(clazz).get(EntityInfo.load(clazz, 0, null).getPrimary().field()), id)); manager.createQuery(cd).executeUpdate(); } @@ -558,7 +558,7 @@ final class DataJPASource implements DataSource { private void updateColumns(final EntityManager manager, final T value, final String... columns) { final Class clazz = value.getClass(); - final EntityInfo info = EntityInfo.load(clazz, this); + final EntityInfo info = EntityInfo.load(clazz, 0, null); final Attribute idattr = info.getPrimary(); final CriteriaBuilder builder = manager.getCriteriaBuilder(); final CriteriaUpdate cd = builder.createCriteriaUpdate(clazz); @@ -891,8 +891,7 @@ final class DataJPASource implements DataSource { } /** - * 注意: 尚未实现识别express功能 - * 根据指定字段值查询对象集合, 对象只填充或排除SelectColumn指定的字段 + * 注意: 尚未实现识别express功能 根据指定字段值查询对象集合, 对象只填充或排除SelectColumn指定的字段 * * @param * @param clazz @@ -1036,7 +1035,7 @@ final class DataJPASource implements DataSource { private List selectList(final Class clazz, final SelectColumn selects, final List list) { if (selects == null || selects.isEmpty() || list.isEmpty()) return list; - final EntityInfo info = EntityInfo.load(clazz, this); + final EntityInfo info = EntityInfo.load(clazz, 0, null); final Object dftValue = info.getCreator().create(); final Map map = info.getAttributes(); final List attrs = new ArrayList<>(); diff --git a/src/com/wentch/redkale/source/EntityCache.java b/src/com/wentch/redkale/source/EntityCache.java index e3c269d0e..96b1d2c7c 100644 --- a/src/com/wentch/redkale/source/EntityCache.java +++ b/src/com/wentch/redkale/source/EntityCache.java @@ -42,8 +42,8 @@ final class EntityCache { private boolean fullloaded; - public EntityCache(final Class type, Creator creator, - Attribute primary, Map> attributes) { + public EntityCache(final Class type, Creator creator, Attribute primary, + Map> attributes, Function, List> fullloader) { this.type = type; this.creator = creator; this.primary = primary; @@ -59,9 +59,14 @@ final class EntityCache { return false; } }); + AutoLoad auto = type.getAnnotation(AutoLoad.class); + if (auto != null && auto.value() && fullloader != null) { + fullLoad(fullloader.apply(type)); + } } public void fullLoad(List all) { + if (all == null) return; clear(); all.stream().filter(x -> x != null).forEach(x -> this.map.put(this.primary.get(x), x)); this.list.addAll(all); diff --git a/src/com/wentch/redkale/source/EntityInfo.java b/src/com/wentch/redkale/source/EntityInfo.java index fabb7217b..6a2410e0d 100644 --- a/src/com/wentch/redkale/source/EntityInfo.java +++ b/src/com/wentch/redkale/source/EntityInfo.java @@ -13,6 +13,7 @@ import java.sql.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; import java.util.logging.*; import javax.persistence.*; @@ -28,6 +29,8 @@ public final class EntityInfo { private static final Logger logger = Logger.getLogger(EntityInfo.class); + static final Set cacheClasses = new HashSet<>(); + //Entity类的类名 private final Class type; @@ -83,29 +86,21 @@ public final class EntityInfo { final int allocationSize; //------------------------------------------------------------ - public static EntityInfo load(Class clazz, final DataSource source) { + public static EntityInfo load(Class clazz, final int nodeid, + Function fullloader) { EntityInfo rs = entityInfos.get(clazz); if (rs != null) return rs; synchronized (entityInfos) { rs = entityInfos.get(clazz); if (rs == null) { - rs = new EntityInfo(clazz, ((DataJDBCSource) source).nodeid, ((DataJDBCSource) source).cacheClasses); + rs = new EntityInfo(clazz, nodeid, fullloader); entityInfos.put(clazz, rs); - if (rs.cache != null && source != null) { - AutoLoad auto = clazz.getAnnotation(AutoLoad.class); - if (auto != null && auto.value()) { - long s = System.currentTimeMillis(); - rs.cache.fullLoad(source.queryList(clazz, null)); - long e = System.currentTimeMillis() - s; - if (logger.isLoggable(Level.FINEST)) logger.finest(clazz.getName() + " full auto loaded for cache in " + e + " ms"); - } - } } return rs; } } - private EntityInfo(Class type, int nodeid, final List cacheClasses) { + private EntityInfo(Class type, int nodeid, Function, List> fullloader) { this.type = type; //--------------------------------------------- this.nodeid = nodeid; @@ -216,7 +211,7 @@ public final class EntityInfo { Cacheable c = type.getAnnotation(Cacheable.class); boolean cf = (c == null) ? (cacheClasses != null && cacheClasses.contains(type)) : false; if ((c != null && c.value()) || cf) { - this.cache = new EntityCache<>(type, creator, primary, attributes); + this.cache = new EntityCache<>(type, creator, primary, attributes, fullloader); } else { this.cache = null; } diff --git a/src/com/wentch/redkale/source/FilterInfo.java b/src/com/wentch/redkale/source/FilterInfo.java index 67bdd69e4..17943e147 100644 --- a/src/com/wentch/redkale/source/FilterInfo.java +++ b/src/com/wentch/redkale/source/FilterInfo.java @@ -82,7 +82,7 @@ final class FilterInfo { joinTables.put(joinCol.table(), String.valueOf((char) ('a' + (++index)))); } String alias = joinTables.get(joinCol.table()); - EntityInfo info = EntityInfo.load(joinCol.table(), source); + EntityInfo info = EntityInfo.load(joinCol.table(), 0, null); EntityCache cache = null; if (info.getCache() != null && info.getCache().isFullLoaded()) { cache = info.getCache(); @@ -90,7 +90,7 @@ final class FilterInfo { cachejoin = false; } item = new FilterItem(field, alias, cache); - EntityInfo secinfo = EntityInfo.load(joinCol.table(), null); + EntityInfo secinfo = EntityInfo.load(joinCol.table(), 0, null); if (!again) { joinsb.append(" ").append(joinCol.type().name()).append(" JOIN ").append(secinfo.getTable()) .append(" ").append(alias).append(" ON a.# = ").append(alias).append(".")