|
@@ -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(); // 任务执行完毕后解除数据源绑定,以便恢复使用默认数据源进行后续任务处理
|
|
|
+// }
|
|
|
+// });
|
|
|
+// }
|
|
|
+// }
|
|
|
+}
|