Browse Source

拦截sql逻辑校验

韩帛霖 1 year ago
parent
commit
500175d7e6

+ 6 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/SqlInterceptor.java

@@ -31,13 +31,18 @@ public class SqlInterceptor implements Interceptor {
 
     // 根据类型设置不同的选择数据源格式
     private String modifySql(String sql) {
+        try {
+            SecurityUtils.getDatabaseType();
+        } catch (Exception e) {
+            return sql;
+        }
         if (SecurityUtils.getDatabaseType().equals("sqlserver"))
             return "USE `" + SecurityUtils.getDatabaseName() + "`; " + sql;
         if (SecurityUtils.getDatabaseType().equals("dm"))
             return "set schema " + SecurityUtils.getDatabaseName() + "; " + sql;
         if (SecurityUtils.getDatabaseType().equals("mysql"))
             return "USE `" + SecurityUtils.getDatabaseName() + "`; " + sql;
-        return "";
+        return sql;
     }
 
     @Override

+ 24 - 0
ruoyi-system/src/main/java/com/ruoyi/system/test/DataSourceManager.java

@@ -0,0 +1,24 @@
+package com.ruoyi.system.test;
+
+import javax.sql.DataSource;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class DataSourceManager {
+    // 使用 ConcurrentHashMap 存储数据源
+    private final ConcurrentHashMap<String, DataSource> dataSourceMap;
+
+    public DataSourceManager() {
+        dataSourceMap = new ConcurrentHashMap<>();
+    }
+
+    // 添加数据源
+    public void addDataSource(String name, DataSource dataSource) {
+        dataSourceMap.put(name, dataSource);
+    }
+
+    // 获取数据源
+    public DataSource getDataSource(String name) {
+        return dataSourceMap.get(name);
+    }
+}

+ 95 - 0
ruoyi-system/src/main/java/com/ruoyi/system/test/DataSourceSwitchManager.java

@@ -0,0 +1,95 @@
+package com.ruoyi.system.test;
+
+
+import javax.sql.DataSource;
+
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.concurrent.*;
+
+// 数据源切换管理器
+public class DataSourceSwitchManager {
+
+//
+//    // 存储数据源的ConcurrentHashMap
+//    private final ConcurrentHashMap<String, DataSource> dataSourceMap;
+//
+//    // 线程池
+//    private final ExecutorService executorService;
+//
+//    // 任务队列
+//    private final BlockingQueue<Runnable> taskQueue;
+//
+//    // 默认数据源的名称
+//    private final String defaultDataSource;
+//
+//    public DataSourceSwitchManager(String defaultDataSource, int threadPoolSize, int taskQueueCapacity) {
+//        this.defaultDataSource = defaultDataSource;
+//        this.dataSourceMap = new ConcurrentHashMap<>();
+//        this.executorService = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(taskQueueCapacity));
+//        this.taskQueue = new LinkedBlockingQueue<>();
+//    }
+//
+//    // 添加数据源
+//    public void addDataSource(String name, DataSource dataSource) {
+//        dataSourceMap.put(name, dataSource);
+//    }
+//
+//    // 获取数据源,如果当前线程没有指定数据源,则使用默认数据源
+//    public DataSource getDataSource() {
+//        return getThreadLocalDataSource().orElse(dataSourceMap.get(defaultDataSource));
+//    }
+//
+//    // 获取线程绑定的数据源,如果未绑定则返回Optional.empty()
+//    public Optional<DataSource> getThreadLocalDataSource() {
+//        return Optional.ofNullable((DataSource) Thread.currentThread().getContextClassLoader().getResource("threadlocal-data-source"));
+//    }
+//
+//    // 在线程中绑定数据源,将数据源对象存入threadlocal中以便在当前线程中使用
+//    public void bindDataSource(String name) {
+//        DataSource dataSource = dataSourceMap.get(name);
+//        if (dataSource != null) {
+//            Thread thread = Thread.currentThread();
+//            ClassLoader classLoader = thread.getContextClassLoader();
+//            if (classLoader == null) {
+//                classLoader = ClassLoader.getSystemClassLoader();
+//                thread.setContextClassLoader(classLoader);
+//            }
+//            ThreadLocal<DataSource> threadLocalDataSource = (ThreadLocal<DataSource>) classLoader.getResource("threadlocal-data-source");
+//            if (threadLocalDataSource == null) {
+//                threadLocalDataSource = new ThreadLocal<>();
+//                classLoader.putResource("threadlocal-data-source", threadLocalDataSource);
+//            }
+//            threadLocalDataSource.set(dataSource);
+//        }
+//    }
+//
+//    // 在线程中解除数据源绑定,清除threadlocal中的数据源对象以便恢复使用默认数据源
+//    public void unbindDataSource() {
+//        Thread thread = Thread.currentThread();
+//        ClassLoader classLoader = thread.getContextClassLoader();
+//        if (classLoader != null) {
+//            ThreadLocal<DataSource> threadLocalDataSource = (ThreadLocal<DataSource>) classLoader.getResource("threadlocal-data-source");
+//            if (threadLocalDataSource != null) {
+//                threadLocalDataSource.remove();
+//            }
+//        }
+//    }
+//
+//    // 提交任务到线程池处理,如果当前线程未绑定数据源,则使用默认数据源进行任务处理
+//    public void submitTask(Runnable task) {
+//        if (task != null) {
+//            executorService.submit(() -> {
+//                bindDataSource(defaultDataSource); // 如果当前线程未绑定数据源,则使用默认数据源进行任务处理
+//                try {
+//                    task.run();
+//                } finally {
+//                    unbindDataSource(); // 任务执行完毕后解除数据源绑定,以便恢复使用默认数据源进行后续任务处理
+//                }
+//            });
+//        }
+//    }
+}

+ 21 - 0
ruoyi-system/src/main/java/com/ruoyi/system/test/DatabaseService.java

@@ -0,0 +1,21 @@
+package com.ruoyi.system.test;
+
+import java.util.concurrent.*;
+
+public class DatabaseService {
+    private static ExecutorService executorService;
+    private static BlockingQueue<Runnable> taskQueue;
+
+    static {
+        int corePoolSize = 10; // 核心线程数
+        int maximumPoolSize = 20; // 最大线程数
+        long keepAliveTime = 5000; // 空闲线程等待新任务的最长时间(毫秒)
+        int queueCapacity = 500; // 任务队列容量
+        taskQueue = new LinkedBlockingQueue<>(queueCapacity);
+        executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, taskQueue);
+    }
+
+    public static void executeTask(Runnable task) {
+        executorService.execute(task);
+    }
+}

+ 22 - 0
ruoyi-system/src/main/java/com/ruoyi/system/test/DynamicDataSourceContext.java

@@ -0,0 +1,22 @@
+package com.ruoyi.system.test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class DynamicDataSourceContext {
+    private ThreadLocal<String> dataSourceNameThreadLocal;
+
+    public DynamicDataSourceContext() {
+        dataSourceNameThreadLocal = new ThreadLocal<>();
+    }
+
+    // 设置当前线程的数据源标识
+    public void setDataSourceName(String name) {
+        dataSourceNameThreadLocal.set(name);
+    }
+
+    // 清除当前线程的数据源标识
+    public void clearDataSourceName() {
+        dataSourceNameThreadLocal.remove();
+    }
+}

File diff suppressed because it is too large
+ 53 - 58
ruoyi-system/src/main/java/com/ruoyi/system/test/ljj.java


Some files were not shown because too many files changed in this diff