From bd872f624a043b00af1124607929e04230dbd212 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期六, 27 七月 2024 23:57:13 +0800 Subject: [PATCH] fix 修复 代码生成 数据源切换问题 --- ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java | 11 ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java | 9 + ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java | 7 + pom.xml | 2 ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java | 349 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 371 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 8c1e35a..0764a75 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ <!-- 闄愬埗妗嗘灦涓殑fastjson鐗堟湰 --> <fastjson.version>1.2.83</fastjson.version> <!-- 闈㈠悜杩愯鏃剁殑D-ORM渚濊禆 --> - <anyline.version>8.7.2-20240726</anyline.version> + <anyline.version>8.7.2-20240727</anyline.version> <!--宸ヤ綔娴侀厤缃�--> <flowable.version>7.0.1</flowable.version> diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java new file mode 100644 index 0000000..b264fc9 --- /dev/null +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/anyline/proxy/CacheProxy.java @@ -0,0 +1,349 @@ +/* + * Copyright 2006-2023 www.anyline.org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +package org.anyline.proxy; + +import org.anyline.cache.CacheProvider; +import org.anyline.data.param.ConfigStore; +import org.anyline.data.runtime.DataRuntime; +import org.anyline.entity.OriginRow; +import org.anyline.metadata.*; +import org.anyline.metadata.graph.EdgeTable; +import org.anyline.metadata.graph.VertexTable; +import org.anyline.util.ConfigTable; +import org.anyline.util.encrypt.MD5Util; + +import java.util.LinkedHashMap; +import java.util.List; + +public class CacheProxy { + + private static final ThreadLocal<OriginRow> thread_caches = new ThreadLocal<>(); + private static final ThreadLocal<OriginRow> thread_names = new ThreadLocal<>(); + private static OriginRow application_caches = new OriginRow(); + private static OriginRow application_names = new OriginRow(); + public static CacheProvider provider; + public CacheProxy() {} + public static void init(CacheProvider provider) { + CacheProxy.provider = provider; + } + private static OriginRow caches(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_caches.get(); + if(null == result){ + result = new OriginRow(); + thread_caches.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_caches.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_caches = new OriginRow(); + } + result = application_caches; + } + return result; + } + private static OriginRow names(){ + OriginRow result = new OriginRow(); + if(ConfigTable.METADATA_CACHE_SCOPE == 1){ + result = thread_names.get(); + if(null == result){ + result = new OriginRow(); + thread_names.set(result); + } + }else if(ConfigTable.METADATA_CACHE_SCOPE == 9){ + if(application_names.isExpire(ConfigTable.METADATA_CACHE_SECOND*1000)){ + application_names = new OriginRow(); + } + result = application_names; + } + return result; + } +/* + + private static Map<String, DataRow> cache_columns = new HashMap<>(); + private static Map<String, Map<String, String>> cache_names = new HashMap<>(); + private static Map<String, DataRow> cache_table_maps = new HashMap<>(); + private static Map<String, DataRow> cache_view_maps = new HashMap<>(); +*/ + + + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern, int types, ConfigStore configs){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern).append("_").append(types); + if(null != configs){ + key.append(MD5Util.crypto(configs.json()));; + } + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Table table){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + String name = table.getName(); + String catalog = table.getCatalogName(); + String schema = table.getSchemaName(); + if(null != catalog){ + key.append(catalog); + } + key.append("_"); + if(null != schema){ + key.append(schema); + } + key.append("_").append(name); + return key.toString().toUpperCase(); + } + public static String key(DataRuntime runtime, String flag, boolean greedy, Catalog catalog, Schema schema, String pattern){ + StringBuilder key = new StringBuilder(); + key.append(runtime.datasource()).append("_").append(flag).append("_").append(greedy).append("_"); + if(null != catalog){ + key.append(catalog.getName()); + } + key.append("_"); + if(null != schema){ + key.append(schema.getName()); + } + key.append("_").append(pattern); + return key.toString().toUpperCase(); + } + public static String name(String key) { + return names().getString(key.toUpperCase()); + } + public static void name(String key, String origin) { + names().put(key.toUpperCase(), origin); + } + public static <T extends Table> List<T> tables(String cache){ + List<T> tables = (List<T>)caches().get(cache); + return tables; + } + public static <T extends MasterTable> List<T> masterTables(String cache){ + List<T> tables = (List<T>)caches().get(cache); + return tables; + } + public static <T extends EdgeTable> List<T> edgeTables(String cache){ + List<T> tables = (List<T>)caches().get(cache); + return tables; + } + public static <T extends VertexTable> List<T> vertexTables(String cache){ + List<T> tables = (List<T>)caches().get(cache); + return tables; + } + public static <T extends Table> void tables(String cache, List<T> tables){ + caches().put(cache, tables); + } + + public static <T extends View> List<T> views(String cache){ + List<T> view = (List<T>)caches().get(cache); + return view; + } + public static <T extends View> void views(String cache, List<T> view){ + caches().put(cache, view); + } + + public static void cache(String cache, Object value){ + caches().put(cache, value); + } + +/* + public static <T extends Table> void name(DriverAdapter adapter, List<T> tables) { + if(null != tables) { + for (Table table : tables) { + name(adapter, table.getCatalog(), table.getSchema(), table.getName(), table.getName()); + } + } + }*/ +/* + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema) { + String key = null; + String catalog_name = null; + String schema_name = null; + if(null != catalog && adapter.supportCatalog()) { + catalog_name = catalog.getName(); + } + if(null != schema && adapter.supportSchema()) { + schema_name = schema.getName(); + } + if(null != catalog_name) { + key = catalog_name; + } + if(null != schema_name) { + if(null != key) { + key += "_" + schema_name; + }else{ + key = schema_name; + } + } + if(null != key) { + key = key.toUpperCase(); + }else{ + key = "ALL"; + } + return key; + } + private static String key(DriverAdapter adapter, Catalog catalog, Schema schema, Table table) { + String table_name = null; + if(null != table) { + table_name = table.getName(); + } + String key = key(adapter, catalog, schema); + if(null != table_name) { + if(null != key) { + key += ":" + table_name; + }else{ + key = table_name; + } + } + if(null != key) { + key = key.toUpperCase(); + } + return key; + }*//* + public static void name(DriverAdapter adapter, Catalog catalog, Schema schema, String name, String origin) { + String group_key = key(adapter, catalog, schema); + Map<String, String> maps = cache_names.get(group_key); + if(null == maps) { + maps = new HashMap<>(); + cache_names.put(group_key, maps); + } + String name_key = (group_key + ":" + name).toUpperCase(); + maps.put(name_key, origin); + } + public static Map<String, String> names(DriverAdapter adapter, Catalog catalog, Schema schema) { + return cache_names.get(key(adapter, catalog, schema)); + } + public static String name(DriverAdapter adapter, boolean greedy, Catalog catalog, Schema schema, String name) { + if(null == name) { + return null; + } + String group_key = key(adapter, catalog, schema); + Map<String, String> maps = cache_names.get(group_key); + if(null != maps) { + String name_key = (group_key + ":" + name).toUpperCase(); + String origin = maps.get(name_key); + if(null != origin) { + return origin; + } + } + if(greedy) { + for (Map<String, String> names : cache_names.values()) { + for(String item:names.keySet()) { + if(item.endsWith((":"+name).toUpperCase())) { + return names.get(item); + } + } + } + } + return null; + }*/ + /*public static String datasource(String datasource) { + if(null == datasource || "common".equalsIgnoreCase(datasource)) { + //datasource = DataSourceHolder.curDataSource(); + } + if(null == datasource) { + datasource = "default"; + } + return datasource.toUpperCase(); + } +*//* + public static String tableName(String datasource, String name) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static String viewName(String datasource, String name) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null != row) { + return row.getString(name); + } + return name; + } + public static void setTableMaps(String datasource, DataRow maps) { + cache_table_maps.put(datasource(datasource), maps); + } + public static void setViewMaps(String datasource, DataRow maps) { + cache_view_maps.put(datasource(datasource), maps); + }*/ + + + /* public static DataRow getTableMaps(String datasource) { + DataRow row = cache_table_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_table_maps.put(datasource(datasource), row); + } + return row; + }*/ + + /* public static DataRow getViewMaps(String datasource) { + DataRow row = cache_view_maps.get(datasource(datasource)); + if(null == row) { + row = new DataRow(); + cache_view_maps.put(datasource(datasource), row); + } + return row; + }*/ + + + public static <T extends Column> LinkedHashMap<String, T> columns(String key) { + return (LinkedHashMap<String, T>) caches().get(key); + } + public static <T extends Tag> LinkedHashMap<String, T> tags(String key) { + return (LinkedHashMap<String, T>) caches().get(key); + } + + + /* public static <T extends Column> void columns(DriverAdapter adapter, String datasource, Table table, LinkedHashMap<String, T> columns) { + if(null == table) { + return; + } + String cache = ConfigTable.getString("METADATA_CACHE_KEY"); + String key = datasource(datasource) + "_COLUMNS_" + key(adapter, table.getCatalog(), table.getSchema(), table); + key = key.toUpperCase(); + if(null != provider && BasicUtil.isNotEmpty(cache) && !ConfigTable.IS_CACHE_DISABLED) { + provider.put(cache, key, columns); + }else{ + DataRow static_cache = new DataRow(); + static_cache.put("keys", columns); + cache_columns.put(key, static_cache); + } + } */ + + public static void clear() {/* + if(null != provider && !ConfigTable.IS_CACHE_DISABLED) { + String cache = ConfigTable.METADATA_CACHE_KEY; + if(BasicUtil.isNotEmpty(cache)) { + provider.clear(cache); + } + }else{ + cache_columns.clear(); + }*/ + + caches().clear(); + names().clear(); + } + +} diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java index 906733b..bb07606 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java @@ -15,6 +15,11 @@ import java.util.HashMap; import java.util.Map; +/** + * anyline 閫傞厤 鍔ㄦ�佹暟鎹簮鏀归�� + * + * @author Lion Li + */ @Slf4j @Component public class MyBatisDataSourceMonitor implements DataSourceMonitor { @@ -22,6 +27,8 @@ public MyBatisDataSourceMonitor() { // 璋冩暣鎵ц妯″紡涓鸿嚜瀹氫箟 ConfigTable.KEEP_ADAPTER = 2; + // 绂佺敤缂撳瓨 + ConfigTable.METADATA_CACHE_SCOPE = 0; } private final Map<String, String> features = new HashMap<>(); diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java index 23eb889..b4abc90 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java @@ -17,13 +17,13 @@ import lombok.extern.slf4j.Slf4j; import org.anyline.metadata.Column; import org.anyline.metadata.Table; -import org.anyline.proxy.CacheProxy; import org.anyline.proxy.ServiceProxy; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.file.FileUtils; @@ -269,7 +269,7 @@ int row = baseMapper.insert(table); if (row > 0) { // 淇濆瓨鍒椾俊鎭� - List<GenTableColumn> genTableColumns = selectDbTableColumnsByName(tableName, dataName); + List<GenTableColumn> genTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(tableName, dataName); List<GenTableColumn> saveColumns = new ArrayList<>(); for (GenTableColumn column : genTableColumns) { GenUtils.initColumnField(column, table); @@ -293,9 +293,8 @@ * @return 鍒椾俊鎭� */ @DS("#dataName") - private List<GenTableColumn> selectDbTableColumnsByName(String tableName, String dataName) { - // 娓呯悊anyline缂撳瓨 - CacheProxy.clear(); + @Override + public List<GenTableColumn> selectDbTableColumnsByName(String tableName, String dataName) { LinkedHashMap<String, Column> columns = ServiceProxy.metadata().columns(tableName); List<GenTableColumn> tableColumns = new ArrayList<>(); columns.forEach((columnName, column) -> { @@ -407,7 +406,7 @@ List<GenTableColumn> tableColumns = table.getColumns(); Map<String, GenTableColumn> tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName); - List<GenTableColumn> dbTableColumns = selectDbTableColumnsByName(table.getTableName(), table.getDataName()); + List<GenTableColumn> dbTableColumns = SpringUtils.getAopProxy(this).selectDbTableColumnsByName(table.getTableName(), table.getDataName()); if (CollUtil.isEmpty(dbTableColumns)) { throw new ServiceException("鍚屾鏁版嵁澶辫触锛屽師琛ㄧ粨鏋勪笉瀛樺湪"); } diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java index 2a2fb82..b2c20c5 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/IGenTableService.java @@ -86,6 +86,15 @@ void importGenTable(List<GenTable> tableList, String dataName); /** + * 鏍规嵁琛ㄥ悕绉版煡璇㈠垪淇℃伅 + * + * @param tableName 琛ㄥ悕绉� + * @param dataName 鏁版嵁婧愬悕绉� + * @return 鍒椾俊鎭� + */ + List<GenTableColumn> selectDbTableColumnsByName(String tableName, String dataName); + + /** * 棰勮浠g爜 * * @param tableId 琛ㄧ紪鍙� -- Gitblit v1.9.3