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