Переглянути джерело

update anyline 8.7.2-20240726

疯狂的狮子Li 9 місяців тому
батько
коміт
86acb14f05

+ 1 - 1
pom.xml

@@ -51,7 +51,7 @@
         <!-- 限制框架中的fastjson版本 -->
         <fastjson.version>1.2.83</fastjson.version>
         <!-- 面向运行时的D-ORM依赖 -->
-        <anyline.version>8.7.2-20240722</anyline.version>
+        <anyline.version>8.7.2-20240726</anyline.version>
         <!--工作流配置-->
         <flowable.version>7.0.1</flowable.version>
 

+ 81 - 0
ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/config/MyBatisDataSourceMonitor.java

@@ -0,0 +1,81 @@
+package org.dromara.generator.config;
+
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.anyline.data.datasource.DataSourceMonitor;
+import org.anyline.util.ConfigTable;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceUtils;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class MyBatisDataSourceMonitor implements DataSourceMonitor {
+
+    public MyBatisDataSourceMonitor() {
+        // 调整执行模式为自定义
+        ConfigTable.KEEP_ADAPTER = 2;
+    }
+
+    private final Map<String, String> features = new HashMap<>();
+
+    /**
+     * 数据源特征 用来定准 adapter 包含数据库或JDBC协议关键字<br/>
+     * 一般会通过 产品名_url 合成 如果返回null 上层方法会通过driver_产品名_url合成
+     *
+     * @param datasource 数据源
+     * @return String 返回null由上层自动提取
+     */
+    @Override
+    public String feature(Object datasource) {
+        String feature = null;
+        if (datasource instanceof JdbcTemplate jdbc) {
+            DataSource ds = jdbc.getDataSource();
+            if (ds instanceof DynamicRoutingDataSource) {
+                String key = DynamicDataSourceContextHolder.peek();
+                feature = features.get(key);
+                if (null == feature) {
+                    Connection con = null;
+                    try {
+                        con = DataSourceUtils.getConnection(ds);
+                        DatabaseMetaData meta = con.getMetaData();
+                        String url = meta.getURL();
+                        feature = meta.getDatabaseProductName().toLowerCase().replace(" ", "") + "_" + url;
+                        features.put(key, feature);
+                    } catch (Exception e) {
+                        log.error(e.getMessage(), e);
+                    } finally {
+                        if (null != con && !DataSourceUtils.isConnectionTransactional(con, ds)) {
+                            DataSourceUtils.releaseConnection(con, ds);
+                        }
+                    }
+                }
+            }
+        }
+        return feature;
+    }
+
+    /**
+     * ConfigTable.KEEP_ADAPTER=2 : 根据当前接口判断是否保持同一个数据源绑定同一个adapter<br/>
+     * DynamicRoutingDataSource类型的返回false,因为同一个DynamicRoutingDataSource可能对应多类数据库, 如果项目中只有一种数据库 应该直接返回true
+     *
+     * @param datasource 数据源
+     * @return boolean
+     */
+    @Override
+    public boolean keepAdapter(Object datasource) {
+        if (datasource instanceof JdbcTemplate jdbc) {
+            DataSource ds = jdbc.getDataSource();
+            return !(ds instanceof DynamicRoutingDataSource);
+        }
+        return true;
+    }
+
+}

+ 1 - 1
ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/service/GenTableServiceImpl.java

@@ -186,7 +186,7 @@ public class GenTableServiceImpl implements IGenTableService {
     @Override
     public List<GenTable> selectDbTableListByNames(String[] tableNames, String dataName) {
         Set<String> tableNameSet = new HashSet<>(List.of(tableNames));
-        LinkedHashMap<String, Table<?>> tablesMap = ServiceProxy.service(dataName).metadata().tables();
+        LinkedHashMap<String, Table<?>> tablesMap = ServiceProxy.metadata().tables();
 
         if (CollUtil.isEmpty(tablesMap)) {
             return new ArrayList<>();